iOS 7 在 UINavigationController 中呈现模式视图?
Posted
技术标签:
【中文标题】iOS 7 在 UINavigationController 中呈现模式视图?【英文标题】:iOS 7 present modal view inside UINavigationController? 【发布时间】:2013-11-21 23:04:24 【问题描述】:我的应用是使用 UINavigationController 设置的,用于所有导航。我想使用模态转换在应用程序中呈现特定的视图控制器。问题是我想将新的 VC 嵌入导航控制器中,但只是一个视图需要使用模态动画而不是推送。
如何在 UINavigationController 内的单个视图控制器上实现此模态动画/过渡?
请记住,在此模态动画发生后,该页面上的按钮将继续按照标准 UINavigationController 推送动画工作。
【问题讨论】:
忘记有类似模态的东西并做一个presentModalView。应该可以的。 在 ios 7 中,presentModalViewController 已被弃用,当我执行该方法时,它会将视图从 UINavigationController 中取出。 我的意思是 [self.navigationController presentViewController:yourViewController ...] 模态视图始终是全屏的,但是您可以更改演示样式。 【参考方案1】:ITviewViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"vc"];
vc.modalPresentationStyle = UIModalPresentationFullScreen;
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:Nil];
用您的视图控制器名称替换伪代码。
【讨论】:
这确实有效,但是它将新呈现的 VC 从 UINavigationController 中取出。我想我真正要问的是如何呈现一个与我的导航控制器分开的视图,该视图具有从屏幕底部滑动到顶部的动画,类似于标准模态转换。我需要 UINavigationBar 在这个动画之后持续存在,这样我就可以在之后继续推送新页面。 UIModalPresentationFullScreen 是默认设置。这不会有帮助。它与 [self presentViewController:vc animated:YES completion:Nil]; 帮助什么?这就是通过设置样式并呈现它来显示“模态”的方式。 @PeterFoti 我认为你应该先阅读这个问题。他的问题不是如何显示模态视图,而是如何在不覆盖导航栏的情况下显示模态视图。【参考方案2】:在 iOS7 中,这可以使用新的自定义转换 API 来实现。你可以在这里找到更多信息:http://www.objc.io/issue-5/view-controller-transitions.html
您创建一个动画控制器(交互式或其他方式),并将其传递给导航栏委托的适当方法。在您的动画控制器中,您使用 UIView
动画 API 执行自定义动画。在您的情况下,动画应该执行从底部滑动到正向动画的位置,并从位置滑动到底部以进行反向动画。如果您支持交互式动画,您甚至可以控制动画相对于手指滑动的曲线。
【讨论】:
您个人有使用这个的经验吗?我很好奇,因为如果您让我知道如何针对这种情况进行编码,它将对我有所帮助。这也不适用于低于 iOS 7 的版本,对吗? 是的,这是 iOS7 的新 API。您可以在此处找到有关如何实现以及新的转换 API 一般如何工作的想法:github.com/ColinEberhardt/VCTransitionsLibrary 对于 iOS6,我会说常规的推送动画可能就足够了,您肯定不会像您一样提供完整的体验在 iOS7 上。当您完成应用程序时,iOS7 用户群可能会达到 85% 以上(目前是 80%)。 非常感谢!我正在考虑采用全 iOS 7 路线,但我不完全确定。当大多数用户群已经在使用它时,它确实使它更具吸引力。 这取决于您计划开发多长时间以及您的目标受众是什么。当您创建一个也适用于 iOS6 的应用程序时,显然有一些吸引人的地方。但是您必须考虑增加的测试时间,解决缺少的 API、错误等问题。iOS7 本身包含错误,因此同时处理 iOS6 和 iOS7 可能会非常麻烦。祝你好运! 我认为您的目标受众最有可能升级。尤其是iOS7/7.1一旦发布越狱,采用率会攀升得更高。学生也更有可能更频繁地升级他们的设备,从而拥有能够运行最新操作系统版本的设备。【参考方案3】:模态视图默认为全屏。您需要更改演示样式以显示导航栏
编辑:这仅适用于 iPad。对于 iPhone,您可以使用 MZformsheet 或 Kentnguyen 来获得半模态行为
MyModalViewController *targetController = [[[MyModalViewController alloc] init] autorelease]; targetController.modalPresentationStyle = UIModalPresentationFormSheet; targetController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; //过渡不重要 [自我presentModalViewController:targetController动画:YES]; targetController.view.superview.frame = CGRectMake(0,44/*导航栏的高度*/,height, width);//重要的是后面要这样做 // 这里使用全屏高度和宽度 targetController.view.superview.center = self.view.center;【讨论】:
如原问题的 cmets 中所述,presentModalViewController
已弃用。
@PeterFoti 他可以使用替代 API,但逻辑是一样的。
他正在为 iPhone 开发,这些是 iPad API。 modalPresentationStyle
仅在以模态方式在 iPad 上呈现视图控制器时(正式)被考虑在内。【参考方案4】:
使用此行不是显示的modelviewcontroller
[self presentViewController:vc animated:YES completion:Nil];
【讨论】:
【参考方案5】:也许这样的东西对你有用(自己是 UINavigationController):
- (void)verticalPushViewController:(UIViewController *)controller
[UIApplication sharedApplication].keyWindow.backgroundColor = [UIColor colorWithWhite:1 alpha:0.9];
CATransition* transition = [CATransition animation];
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
transition.duration = 0.3;
transition.type = kCATransitionMoveIn;
transition.subtype = kCATransitionFromTop;
[self.view.layer addAnimation:transition forKey:kCATransition];
[self pushViewController:controller animated:NO];
- (UIViewController *)verticalPopViewController
[UIApplication sharedApplication].keyWindow.backgroundColor = [UIColor colorWithWhite:1 alpha:0.9];
CATransition* transition = [CATransition animation];
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
transition.duration = 0.3;
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromBottom;
[self.view.layer addAnimation:transition forKey:kCATransition];
return [self popViewControllerAnimated:NO];
【讨论】:
【参考方案6】:最简单的方法。
呈现
LaunchImageViewController *launchView = [self.storyboard instantiateViewControllerWithIdentifier:@"launchImage"];
[[UIApplication sharedApplication].keyWindow addSubview:launchView.view];
关闭。我在里面调用这个(LaunchImageViewController)。
[self.view removeFromSuperview];
【讨论】:
以上是关于iOS 7 在 UINavigationController 中呈现模式视图?的主要内容,如果未能解决你的问题,请参考以下文章
iOS 6 UINavigationController 中的奇怪错误