使用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
,但不工作viewDidLoad
或viewWillAppear:animated
。 这不是一个解决scheme,因为用户在viewDidAppear:animated
时发生重绘时会看到视图跳跃
我已经设法解决我的问题,通过在addSubview:
之前添加以下行:
toViewController.view.frame = [transitionContext finalFrameForViewController:toViewController];
从Apple的FinalFrameForViewController的文档:
返回指定视图控制器视图的结束帧矩形。
此方法返回的矩形代表转换结束时相应视图的大小。 对于在演示期间被覆盖的视图,此方法返回的值可能是CGRectZero,但也可能是有效的框架矩形。