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】:

您可以尝试在您的约束中将sourceViewoverlayView 互换吗?

 `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 上将约束应用于子视图的自动布局差异的主要内容,如果未能解决你的问题,请参考以下文章

iOS 纵横比约束在 iOS 7 上中断,适用于 iOS 8

约束常量在 iOS 7 中为零,但在 iOS 8 中没有

在 ios 8 上工作的 iOs 7 被忽略的约束

在 iOS 上将图像和文本内联居中

在 iOS 8 上将视频分享到 Facebook

如何在 iOS 7 上将状态栏内容颜色设置为白色