UIViewController presentViewController modal在iOS7中没有动画

Posted

技术标签:

【中文标题】UIViewController presentViewController modal在iOS7中没有动画【英文标题】:UIViewController presentViewController modal not animating in iOS7 【发布时间】:2015-07-01 12:02:21 【问题描述】:

调用presentViewController:animated:completion:ios7 中没有动画。视图立即出现。动画在 iOS8 中正常工作。当前方法在我的应用程序中的三个不同位置调用,它们都显示此行为。它发生在设备和模拟器上。

随后对 dismissViewControllerAnimated:completion: 的调用在所有 iOS 版本中都可以正确设置动画。

代码结构

调用本方法的视图控制器是UINavigationController的根视图控制器,而这个导航控制器是UITabBarController中的viewControllers之一。

每个呼叫都很简单,只需按一下按钮即可触发。这是其中一种情况:

GenreViewController *controller = [[GenreViewController alloc] init]; [self presentViewController:controller animated:YES completion:nil];

尝试修复

显式分派到主线程 演示前致电[UIView setAnimationsEnabled:YES] 为显示控制器添加延迟(只是为了看看会发生什么)

在每种情况下,行为都没有改变。 任何帮助将不胜感激!

更新 - 修复

原来UITabBarControllermodalPresentationStyle 属性被设置为UIModalPresentationCurrentContext。这在 iOS7 中不会动画,您必须改用 UIModalPresentationFullScreen 的演示样式。

【问题讨论】:

您是否覆盖了 GenreViewController 的 init 方法?也许你应该试试 GenreViewController *vc = [[GenreViewController alloc] initWithNibName:NSStringFromClass([GenreViewController class]) bundle:nil]; @Doro 我尝试了 initWithNibName:bundle: (并确保我的超类也都调用了它),但演示文稿仍然没有动画。 【参考方案1】:

你可以用这个

   GenreViewController *addController = [[GenreViewController alloc]

                       init];
   UINavigationController *navigationController = [[UINavigationController alloc]

                             initWithRootViewController:addController];

   [self presentViewController:navigationController animated:YES completion: nil];

【讨论】:

同样的行为,控制器没有动画。 使用下面给出的设置模态转换样式,它可能会起作用。 [navigationController setModalTransitionStyle:UIModalPresentationPageSheet]; 不走运,仍然没有使用 UIModalPresentationPageSheet 的演示动画(既呈现导航控制器又直接呈现视图控制器)。【参考方案2】:

原来UITabBarControllermodalPresentationStyle 属性被设置为UIModalPresentationCurrentContext。这在 iOS7 中不会动画,您必须改用 UIModalPresentationFullScreen 的演示样式。

【讨论】:

【参考方案3】:

根据您的评论

据我所知,如果没有 NavigationController,这个动画是不可能的。如果您以编程方式创建了所有内容,那么您还需要以编程方式创建 NavigationController 并且必须将 ViewController 之一分配为根 ViewController。然后去presentViewController。

在 appDelegate 中制作全局 UINavigationController 在didFinishLaunchingWithOptions

InitialViewController *initialVC = [[InitialViewController alloc] init];
self.navController = [[UINavigationController alloc] initWithRootViewController:initialVC];
self.window.rootViewController = self.navController;
[self.window makeKeyAndVisible];

然后在您想要进行演示的特定 ViewController 中获取您的 Appdelegate Navigation 控制器。

可能是您创建的 NavigationController 在 Navigation Hierarchy 中不正确。

【讨论】:

它是在没有情节提要的情况下构建的,所有视图和控制器都是以编程方式创建的。 我确实以编程方式创建了一个 UINavigationController 并将视图控制器分配为 rootViewController。这是在调用当前方法之前完成的。【参考方案4】:

你能检查一下吗:

GenreViewController *controller = [[GenreViewController alloc] init];
controller.view.backgroundColor = [UIColor whiteColor]; // or some color of your choice
[self presentViewController:controller animated:YES completion:nil];

然后看看它是否有效。我觉得以编程方式使用 UIViewController 可能是问题

【讨论】:

不走运,仍然没有演示动画。

以上是关于UIViewController presentViewController modal在iOS7中没有动画的主要内容,如果未能解决你的问题,请参考以下文章

从另一个 UIViewController 推送一个 UIViewController - 如何?

从另一个 UIViewController 呈现 UIViewController

使用 IBAction UIViewController 弹出 UIViewController

子 UIViewController 视图阻止容器 UIViewController 视图接收触摸事件

允许在下面呈现的 UIViewController 上的 UIViewController 上进行交互

在另一个 UIViewController 中显示一个 UIViewController