简洁版本:
UINavigationController
当与自定义过渡和iOS7结合使用时,我遇到了自动布局顶部布局指南的问题。具体来说,顶部布局指南和文本视图之间的约束没有得到遵守。有没有人遇到过这个问题?
长版:
我有一个明确定义约束(即顶部、底部、左侧和右侧)的场景,它呈现如下视图:
但是当我在导航控制器上使用自定义转换时,顶部布局指南的顶部约束似乎关闭,它呈现如下,好像顶部布局指南在屏幕顶部,而不是在底部导航控制器:
使用自定义转换时,导航控制器的“顶部布局指南”似乎变得混乱。其余的约束正在正确应用。如果我旋转设备并再次旋转它,一切都会突然正确渲染,因此约束没有正确定义似乎不是问题。同样,当我关闭自定义转换时,视图会正确呈现。
话虽如此,当我运行时_autolayoutTrace
报告UILayoutGuide
对象遭受,AMBIGUOUS LAYOUT
(lldb) po [[UIWindow keyWindow] _autolayoutTrace]
但是,即使我确保没有丢失约束(我已经按照惯例选择视图控制器并选择“为视图控制器添加缺少的约束”或选择所有的控件并为它们做同样的事情)。
就我进行转换的精确程度而言,我在方法中指定了一个符合的UIViewControllerAnimatedTransitioning
对象animationControllerForOperation
:
- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController*)fromVC
toViewController:(UIViewController*)toVC
{
if (operation == UINavigationControllerOperationPush)
return [[PushAnimator alloc] init];
return nil;
}
和
@implementation PushAnimator
- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext
{
return 0.5;
}
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
[[transitionContext containerView] addSubview:toViewController.view];
CGFloat width = fromViewController.view.frame.size.width;
toViewController.view.transform = CGAffineTransformMakeTranslation(width, 0);
[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
fromViewController.view.transform = CGAffineTransformMakeTranslation(-width / 2.0, 0);
toViewController.view.transform = CGAffineTransformIdentity;
} completion:^(BOOL finished) {
fromViewController.view.transform = CGAffineTransformIdentity;
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
}];
}
@end
我还对上述内容进行了演绎,设置了frame
视图的而不是transform
,结果相同。
我也尝试过手动确保通过调用重新应用约束layoutIfNeeded
。我也试过setNeedsUpdateConstraints
,setNeedsLayout
等。
底线,有没有人成功地将导航控制器的自定义转换与使用顶部布局指南的约束结合起来?