【发布时间】:2013-11-16 08:09:13
【问题描述】:
我在我的应用程序中实现了一个自定义 UIViewController 转换,它取代了推送动画中内置的导航控制器。
到目前为止一切正常,除了新推送的视图控制器中的 toplayoutguide 为 0,尽管新视图控制器继承了旧视图控制器的导航栏。 它应该是 64.0(状态栏高度 + 导航栏高度),现在是 0.0。 因此,连接到情节提要顶部布局指南的所有对象现在显得过高 64 点(低于半透明条)。
当我禁用自定义视图转换时,顶部布局指南将具有预期值。 我试图“到处”调用 layoutSubviews 和 updateConstraints。在视图控制器以及导航控制器中。
据我了解,navigationcontroller (parentviewcontroller) 应该更新新视图控制器的 toplayoutguide,但显然我在自定义转换代码中遗漏了一些内容,这会触发 toplayoutguide 更新为正确值。
这是我的自定义转换代码,它是一个设置为导航控制器委托的对象:
- (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];
}];
}
那里没有什么特别的事情发生。只是视图从底部向上滑动并带有一些内置动态。
问题是,附加到顶部布局指南的对象现在位于导航栏下方,因为顶部布局指南长度 == 0。
我不知道我需要做什么,因此将视图控制器的 toplayoutguide 设置为正确的值。
推送导航是通过推送故事板segue“普通”执行的。在调用 performSegueWithIdentifier 之前,我所做的只是设置 navigationcontrollers 委托。
代码如下:
self.navigationController.delegate = [[My_CustomNavigationTransitionDelegate alloc] init];
[self performSegueWithIdentifier:@"infosSegue" sender:nil];
我错过了什么?
【问题讨论】:
-
我遇到了同样的问题。令人抓狂的是,转换完成后,旋转设备会将 topLayoutGuide 更新为正确的值。我还没有弄清楚要调用什么来强制 topLayoutGuide 作为此过渡的一部分进行更新。
-
对我来说它看起来像一个错误。我已经在苹果开发者论坛上发布了同样的问题,但没有收到任何答案。现在我求助于没有透明的导航栏,而不是丑陋的解决方法。幸运的是,客户仍然没有看到和理解半透明导航栏的优势,因为他们仍然习惯于以前的样子。但这很快就会改变。我希望在那之前 Apple 的某个好心人会告诉我们如何强制更新布局指南...
-
我遇到了同样的问题,最终实现了我自己的 topLayout 指南视图并对它进行了约束,而不是对 topLayoutGuide。不理想。仅在有人被卡住并寻找快速破解解决方案时才将其发布在这里github.com/stringcode86/SCTopLayoutGuide
-
我也确实有自己的顶部和底部布局约束。目前看来,如果您使用故事板,它似乎是唯一的解决方案。
标签: ios iphone objective-c ios7