我在使用UINavigationController
时,为视图控制器之间创建了一个自定义的push转场效果。在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
时用户会看到视图跳动。