iOS:在 iOS 7 和 iOS 8 上将约束应用于子视图的自动布局差异
Posted
技术标签:
【中文标题】iOS:在 iOS 7 和 iOS 8 上将约束应用于子视图的自动布局差异【英文标题】:iOS: Autolayout differences with appliying constraints to subview on iOS 7 and iOS 8 【发布时间】:2015-03-03 09:55:26 【问题描述】:我在情节提要中设置了一个视图控制器。视图控制器的视图包含一个子视图 (UITableView
),其父视图的 4 个边都有固定的边缘,实质上是使视图填充其父视图。
我将视图控制器的主视图添加为另一个视图控制器视图的子视图,如下所示:
UIView *overlayView = firstViewController.view;
[overlayView setTranslatesAutoresizingMaskIntoConstraints:NO];
UIView *sourceView = secondViewController.view;
[sourceView addSubview:overlayView];
NSLayoutConstraint *constraint;
constraint = [NSLayoutConstraint constraintWithItem:overlayView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:sourceView attribute:NSLayoutAttributeLeading multiplier:1.0 constant:0];
[sourceView addConstraint:constraint];
constraint = [NSLayoutConstraint constraintWithItem:sourceView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:overlayView attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:100];
[sourceView addConstraint:constraint];
constraint = [NSLayoutConstraint constraintWithItem:overlayView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:sourceView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0];
[sourceView addConstraint:constraint];
constraint = [NSLayoutConstraint constraintWithItem:overlayView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:sourceView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0];
[sourceView addConstraint:constraint];
[sourceView layoutIfNeeded];
我希望从视图的右边缘到其父级的间隙等于 100 像素。
现在奇怪的是,这在 ios 8 上可以按预期工作,但在 iOS 7 上却不能这样做,并且视图会全屏显示,而忽略了在尾随约束上设置的 100
常量。此外,如果正在添加的视图控制器的视图没有子视图 - 那么它按预期工作。 setTranslatesAutoresizingMaskIntoConstraints:
是否应用于 iOS 7 中视图的所有子视图?这可能是什么原因?
编辑:
问题在于操作系统管理子视图的方式。
当容器视图被设置为视图控制器的view
属性的出口时,事情就不起作用了。但是,如果我将表视图设置为view
属性的出口,它就可以工作。如果有一个子视图的父视图带有固定边缘,然后我向父视图添加其他约束,则会发生一些奇怪的事情。我不明白为什么它在 iOS 8 上运行良好...
编辑 2
问题似乎只发生在trailing
约束中。如果我想修改任何其他约束的常量没有问题?!
【问题讨论】:
【参考方案1】:您可以尝试在您的约束中将sourceView
与overlayView
互换吗?
`constraint = [NSLayoutConstraint constraintWithItem:sourceView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:overlayView attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:100];`
这实质上意味着sourceView.trailing - 100 = overlayView.trailing;
这不是您想要的。
编辑 1:
setTranslatesAutoresizingMaskIntoConstraints
: 是否被应用到 iOS 7 中一个视图的所有子视图?
没有。 translatesAutoresizingMaskIntoConstraints
仅为您明确调用 setTranslatesAutoresizingMaskIntoConstraints
的视图设置。
【讨论】:
是的,检查我的编辑。交换它们似乎可以解决问题。我不明白为什么。你有什么想法吗? 您可以阅读我的新答案,它将解决您的困惑。基本上你正在做的是sourceView.trailing - 100 = overlayView.trailing。这意味着您的尾随 overlayView 正试图退出 sourceView。 @pe60t0 如果它回答了您的问题,请将此答案标记为预期。 Jarora,虽然这对我有帮助,但似乎问题出在其他地方。请检查最新的编辑。谢谢。以上是关于iOS:在 iOS 7 和 iOS 8 上将约束应用于子视图的自动布局差异的主要内容,如果未能解决你的问题,请参考以下文章