在iOS 9上使用NavigationController进行推送动画的自定义转换

时间:2015-09-24 10:43:58

标签: ios uinavigationcontroller ios9 custom-transition

我在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,则无效,但不适用于viewDidLoadviewWillAppear:animated。这不是一个解决方案,因为当重绘在viewDidAppear:animated

时,用户会看到视图跳跃

1 个答案:

答案 0 :(得分:22)

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

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

来自Apple的finalFrameForViewController:

文档
  

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

     

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