2015-09-24 31 views
8

定制化我有嵌入UINavigationController时与iOS 7/8内建但是当针对iOS的SDK 9建提出了一个错误的布局,做工精细视图控制器之间的自定义推送过渡。与NavigationController推动画在iOS 9

- (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

回答

22

发生的事情我已经成功地解决我的问题的看法跳跃通过添加以下行addSubview:之前的解决方案:

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

从苹果的文档finalFrameForViewController:

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

通过此方法返回的矩形表示在过渡结束时的对应视图的大小 。用于在演示过程中被覆盖的视图 ,通过该 方法返回的值可以是CGRectZero但它也可能是一个有效的帧 矩形。

+0

救命恩人,感谢队友 – beebcon

+0

你刚刚为我节省了很多时间。非常感谢! –