简短版:
iOS7中,当与自定义转换和UINavigationController
一起使用时,我的自动布局顶部布局指南存在问题。具体地,顶部布局指南和文本视图之间的约束没有被遵守。有人遇到过这个问题吗?
详细版:
我有一个场景,其中已经明确定义了约束(即顶部、底部、左侧和右侧),呈现出以下视图:
但是当我将其与导航控制器上的自定义转换一起使用时,与顶部布局指南的顶部约束似乎不正确,并呈现为如下所示的情况,好像顶部布局指南位于屏幕顶部,而不是在导航控制器底部:
似乎在使用自定义转换时,“顶部布局指南”与导航控制器混淆了。其余约束都被正确应用。如果我旋转设备并再次旋转它,则一切都会突然正确地呈现,因此它似乎不是约束未正确定义的问题。同样,当我关闭自定义转换时,视图会正确呈现。
尽管如此,当我运行以下代码时,_autolayoutTrace
报告UILayoutGuide
对象存在AMBIGUOUS LAYOUT
的问题:
(lldb) po [[UIWindow keyWindow] _autolayoutTrace]
但每当我查看这些布局指南时,它们总被报告为不明确,尽管我已确保没有缺少的约束(我已经惯常地选择视图控制器并选择“为视图控制器添加缺失的约束”或选择所有控件并为它们执行相同操作)。
至于我如何精确进行转换,我已在animationControllerForOperation
方法中指定符合UIViewControllerAnimatedTransitioning
的对象:
- (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
等等。
总之,有没有人成功地将导航控制器的自定义转换与使用顶部布局指南的约束条件结合起来?