我在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
答案 0 :(得分:22)
我设法通过在addSubview:
之前添加以下行来解决我的问题:
toViewController.view.frame = [transitionContext finalFrameForViewController:toViewController];
来自Apple的finalFrameForViewController:
文档返回指定视图控制器的结束帧矩形 图。
此方法返回的矩形表示大小 在过渡结束时的相应视图。对于视图 在演示期间被覆盖,由此返回的值 方法可能是CGRectZero,但它也可能是一个有效的框架 矩形。