Edg*_*gar 8 uinavigationcontroller ios custom-transition ios9
我在嵌入的视图控制器之间有一个自定义推送转换,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];
...
Run Code Online (Sandbox Code Playgroud)
然后它继续并执行动画.问题是toViewController,即使使用右上方布局指南自动布局约束,内容也会显示导航栏后面的内容.
尽管如此,它在iOS 8上运行正常,如果我们强制重绘(例如,将应用程序发送到后台并将其恢复,在顶部呈现模式并将其解除等)将导致整个自动布局系统重绘并且toViewController视图跳转到正确的位置(作为顶部布局指南,导航栏中的x像素,而不是设备屏幕顶部的x像素).
添加
[self.view setNeedsUpdateConstraints];
[self.view layoutIfNeeded];
Run Code Online (Sandbox Code Playgroud)
如果放入viewDidAppear:animated,但不起作用viewDidLoad或工作viewWillAppear:animated.这不是一个解决方案,因为用户会在重绘时看到视图跳跃viewDidAppear:animated
Edg*_*gar 23
我之前通过添加以下行设法解决了我的问题addSubview::
toViewController.view.frame = [transitionContext finalFrameForViewController:toViewController];
Run Code Online (Sandbox Code Playgroud)
来自Apple的finalFrameForViewController文档:
返回指定视图控制器视图的结束帧矩形.
此方法返回的矩形表示转换结束时相应视图的大小.对于在演示期间覆盖的视图,此方法返回的值可能是CGRectZero,但它也可能是有效的框架矩形.