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]
为显示控制器添加延迟(只是为了看看会发生什么)
在每种情况下,行为都没有改变。 任何帮助将不胜感激!
更新 - 修复
原来UITabBarController
的modalPresentationStyle
属性被设置为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】:原来UITabBarController
的modalPresentationStyle
属性被设置为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 视图接收触摸事件