使用iOS 9上的NavigationController自定义推送animation

我有一个embedded在UINavigationController视图控制器之间的自定义推入转换,当使用iOS 7/8构build时工作正常,但是在针对iOS 9 SDK构build时呈现错误的布局。

 - (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext { UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; [transitionContext.containerView addSubview:toViewController.view]; ... 

然后继续进行animation。 问题是toViewController的内容,即使它使用正确的顶部布局指南自动布局约束,呈现导航栏后面的内容。

不过,它在iOS 8上工作的很好,如果我们强制重绘(例如,发送应用程序到背景并将其返回,在顶部呈现模式并将其解除,等等)将导致整个自动布局系统自我重绘toViewController的视图跳转到正确的位置(作为顶部布局指南,来自导航栏的x像素而不是来自设备屏幕顶部的x像素)。

添加

 [self.view setNeedsUpdateConstraints]; [self.view layoutIfNeeded]; 

作品,如果放在viewDidAppear:animated ,但不工作viewDidLoadviewWillAppear:animated 。 这不是一个解决scheme,因为用户在viewDidAppear:animated时发生重绘时会看到视图跳跃

我已经设法解决我的问题,通过在addSubview:之前添加以下行:

  toViewController.view.frame = [transitionContext finalFrameForViewController:toViewController]; 

从Apple的FinalFrameForViewController的文档:

返回指定视图控制器视图的结束帧矩形。

此方法返回的矩形代表转换结束时相应视图的大小。 对于在演示期间被覆盖的视图,此方法返回的值可能是CGRectZero,但也可能是有效的框架矩形。