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 = UIModalTransitionStyleFlipHorizo​​ntal; //过渡不重要 [自我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 中呈现模式视图?的主要内容,如果未能解决你的问题,请参考以下文章

开发直播app 软件时iOS端广告功能设置

iOS 6 UINavigationController 中的奇怪错误

UINavigationController 方向

使用保存/取消按钮创建模态视图

将第二个 UIToolbar 添加到 UITableViewController

为啥这个 UITabBarItem 图像切换代码在 iOS 7 上有效,而在 iOS 7.1 上无效?