在 iOS 9 上使用 NavigationController 进行推送动画的自定义转换
Posted
技术标签:
【中文标题】在 iOS 9 上使用 NavigationController 进行推送动画的自定义转换【英文标题】:Custom transition for push animation with NavigationController on iOS 9 【发布时间】:2015-09-24 10:43:57 【问题描述】:我有一个嵌入在 UINavigationController
中的视图控制器之间的自定义推送转换,它在使用 ios 7/8 构建时工作正常,但在针对 iOS 9 SDK 构建时呈现错误的布局。
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
[transitionContext.containerView addSubview:toViewController.view];
...
然后它继续执行动画。问题是toViewController
的内容,即使它使用了右上布局指南自动布局约束,也会呈现导航栏后面的内容。
尽管如此,它在 iOS 8 上运行良好,如果我们强制重绘(例如,将应用程序发送到后台并将其带回,在顶部显示模式并关闭它等)将导致整个自动布局系统重绘自身,toViewController
的视图跳转到正确的位置(作为顶部布局指南,导航栏的 x 像素而不是设备屏幕顶部的 x 像素)。
添加
[self.view setNeedsUpdateConstraints];
[self.view layoutIfNeeded];
如果放入 viewDidAppear:animated
则有效,但不适用于 viewDidLoad
或 viewWillAppear:animated
。这不是一个解决方案,因为用户会在 viewDidAppear:animated
viewDidAppear:animated
发生重绘时看到视图跳跃
【问题讨论】:
【参考方案1】:我已经通过在addSubview:
之前添加以下行来解决我的问题:
toViewController.view.frame = [transitionContext finalFrameForViewController:toViewController];
来自 Apple 的 finalFrameForViewController: 文档
返回指定视图控制器的结束框矩形 查看。
该方法返回的矩形代表大小 转换结束时的相应视图。对于视图 在演示过程中被覆盖,此返回的值 方法可能是 CGRectZero 但它也可能是一个有效的框架 矩形。
【讨论】:
你刚刚为我节省了很多时间。非常感谢!以上是关于在 iOS 9 上使用 NavigationController 进行推送动画的自定义转换的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 9 问题上使用 Alamofire 上传带有 URL 参数的图像
在 iOS 9.1/9.2 上使用 EXC_BAD_ACCESS CODE 1 的 AppDelegate 类声明应用程序崩溃