iOS7自定义ViewController转换和顶部布局指南

我在我的应用程序中实现了一个自定义的UIViewController Transition,它取代了内置推animation的导航控制器。

一切工作到目前为止,除了在新推视图控制器toplayoutguide是0,虽然新的视图控制器从旧的视图控制器inheritance了导航栏。 它应该是64.0(状态栏高度+导航栏高度),现在是0.0。 因此,连接到故事板中顶部布局指南的所有对象都显示为太高的64个点(在半透明条的下方)。

当我禁用自定义视图转换时,顶部布局指南将具有预期的值。 我试图调用layoutSubviews和updateConstraints“到处都是”。 在视图控制器以及导航控制器中。

据我所知,导航控制器(parentviewcontroller)应该更新新的视图控制器的toplayoutguide,但显然我缺less一些在我的自定义转换代码,触发更新到正确的值toplayoutguide。

这是我的自定义转换代码,它是一个设置为navigationcontroller委托的对象:

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext { return 0.7; } - (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext { UIView *animationContainerView = [transitionContext containerView]; UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIView *toView = [toVC view]; UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIView *fromView = [fromVC view]; CGRect endFrame = [transitionContext finalFrameForViewController:toVC]; CGRect startFrame; startFrame = CGRectOffset(endFrame, 0, endFrame.size.height); if (self.operation == UINavigationControllerOperationPop) { [animationContainerView insertSubview:toView belowSubview:fromView]; [toView setFrame:endFrame]; } else{ [toView setFrame:startFrame]; [animationContainerView insertSubview:toView aboveSubview:fromView]; } [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0 usingSpringWithDamping:0.7 initialSpringVelocity:0.8 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ if (self.operation == UINavigationControllerOperationPop) { [fromView setFrame:startFrame]; [fromView layoutIfNeeded]; } else{ [toView setFrame:endFrame]; [toView layoutIfNeeded]; } } completion:^(BOOL finished) { [transitionContext completeTransition:YES]; }]; } 

那里没有真正的幻想。 只是从底部向上滑动一些内置的dynamic。

现在的问题是,附加到顶部布局指南的对象现在在导航栏下,作为顶部布局指南长度== 0。

我不知道我需要做什么,以便视图控制器的toplayoutguide设置为正确的值。

推导航是执行“简单的香草”与推故事板segue。 在调用performSegueWithIdentifier之前,我所做的一切就是设置navigationcontrollers委托。

代码如下:

  self.navigationController.delegate = [[My_CustomNavigationTransitionDelegate alloc] init]; [self performSegueWithIdentifier:@"infosSegue" sender:nil]; 

我错过了什么?

我有一个问题,其中bottomLayoutGuide属性将自己设置为零长度,然后会导致我的标签栏上方的button下方到标签栏与自动布局。

你看过吗?

 [self.navigationController.view setNeedsLayout] 

我把它放到了我的viewwillappear ,我停止了bottomLayoutGuide属性的零长度。 也许这会帮助你与你的topLayoutGuide属性。

我能够解决这个问题,具有以下视图层次结构:

 UIView UIScrollView <content, constrained to UIScrollView> 

限制UIScrollView以匹配UIView's顶部,顶部,尾部和底部边缘。 界面生成器可能希望您使用UIScrollView的topLayoutGuide和bottomLayoutGuide,或者它可能不会。 也许它是依赖于Xcode的版本,但我们的一些视图控制器使用超视图,其他人使用的布局指南。

对于Interface Builder不想限制滚动视图相对于其超视图的视图,我在文本编辑器中打开故事板,并手动调整滚动视图的约束。

最后,在视图控制器上,确保在顶栏下面的延伸边是YES,调整滚动视图插图也是如此。

基本上,我避免使用topLayoutGuide,而是依靠滚动视图插图,这是行不通的。

在我没有UIScrollView的层次结构中,就像你一样,不是在顶部栏下面延伸的边缘为我工作。

我遇到了同样的问题。 我的自定义导航控制器的容器视图没有约束。 从容器视图到其超级视图的布局指南(虽然两者大小相同)中添加垂直间距约束,并在容器视图上设置顶部/底部/状态栏的外观一切正常,推送的布局指南控制者处于正确的位置。 希望有所帮助。

更新:从topLayoutGuide官方文档

容器视图控制器中的视图控制器不会设置此属性的值。 相反,容器视图控制器将限制值以指示:导航栏的底部,如果导航栏是可见的状态栏的底部(如果只有状态栏可见)视图控制器视图的顶部边缘状态栏和导航栏都不可见

所以容器视图需要实现正确的约束,并隐藏/显示条等,以使效果起作用。 AFAIK没有API在自定义容器视图控制器中执行此操作。

我find了一个方法。 首先取消控制器的“延伸边缘”属性,导航栏会变成深色。 将视图添加到控制器并设置顶部和底部LayoutConstraint -100 。 然后使视图的clipubview属性no (对于navigaionbar transculent effect)。 我的英语很抱歉。 🙂