Xcode 6中的情节提要中的“限制利润率”是什么


248

我正在使用自动布局和约束,发现Constrain to marginsXcode 6中有一个选项在Xcode 5中不存在,并且默认情况下已选中。

我创建了一个测试项目,然后UITableView在ViewController上添加了一个,其框架设置为与视图相同的大小并添加了约束

Xcode 6 即使tableview与视图Xframe建议添加-16作为约束,而Xcode 5建议添加间距0,您也可以在此处看到。

选中约束到边距

现在,当您取消选中“约束到边距”选项时,其行为与Xcode 5相同,建议添加0作为约束

使用约束来保证金未选中

另外,我发现一旦在Constraint中添加约束以Constrain约束,我将无法再在Xcode 5中打开情节提要文件,因此在Xcode 6中绝对是新功能

希望我能够正确解释我的问题。我想了解“限制利润率”的实际作用,以及何时应该使用和不应该使用它。如果这很简单明显,我对此表示歉意。

编辑

我在这里的讨论中发现了一些有关布局边距的信息,我想知道这是否与此有关。


15
无需道歉-这一点根本不明显。
Ben Clayton 2014年

4
+1无需道歉,我也想问这个问题。顺便说一句:在Xcode5中打开情节提要看看:stackoverflow.com/a/25298909/529243
Olaf

1
这是最接近我已经找到一个解释:stackoverflow.com/questions/25275901/...
纳撒尼尔

如何禁用此功能?
Orkenstein 2014年

2
是的,那才是真正的痛苦。我还没弄清楚如何永久取消选中它。
Bhumit Mehta

Answers:


315

我根本不明白为什么人们会抱怨“ 保证金会导致iOS 8之前的所有版本完全崩溃 ”。

在厦门国际银行文件或情节串连图板设置你的约束相对于保证金DOES NOT作出iOS7您的应用程序崩溃,并且它DOES NOT使您iOS7设备上的UI差别都不是,只要你不碰UIView.layoutMarginsUIView.preservesSuperviewLayoutMargins性能在你的代码。

什么是iOS8中的保证金

布局利润代表围绕填充内部UIView该布局当子视图的布局系统可以使用-确保的间隙的视图和一个子视图的边缘之间留下。在这方面,它非常类似于与CSS中的块关联的padding属性。

在此处输入图片说明

默认情况下,a的UIView每侧布局边距为8点,并且不能在Interface Builder中更改。但是,通过UIView.layoutMargins在代码中设置属性(仅在iOS8上可用),您可以调整这些值。

您可以通过“ 编辑器”>“画布”>“显示布局矩形”来显示IB以显示边距 在此处输入图片说明

边距可用于帮助布局视图和子视图。UIView默认情况下,每个都有边距,但是它们仅在您设置与边距相关的约束时才影响视图放置。

如何使用保证金

在Interface Builder中使用边距的唯一方法是在配置约束时检查“ 相对于边距”选项。这是在布局视图时将约束指示为使用边距而不是边缘的方式。

在此处输入图片说明

让我们看一下在视图及其子视图之间设置领先约束的四种不同方式。对于每个约束,我们审查所描述第一个关联将是子视图的领导,而第二个将是superview的领导。您要密切注意的是每个约束端的“ 相对于边距”选项的选中和取消选中状态,因为这定义了约束是绑定到视图的边距还是边缘。

  1. 第一项(取消选中),第二项(选中):在这种情况下,我们声明子视图的左边缘应与超级视图的左边缘对齐(如下图所示)。

在此处输入图片说明

  1. 第一项(取消选中),第二项(取消选中):两者都使用edge,而不使用margin。在这种情况下,我们声明子视图的左边缘应与超级视图的左边缘对齐。

在此处输入图片说明

  1. 第一项(选中),第二项(取消选中):在这种情况下,我们声明子视图的左边界应与超级视图的左边缘对齐。这种布局实际上使子视图与超级视图重叠。

在此处输入图片说明

  1. 第一项(检查),第二项(检查)。实际上,这与情况2具有相同的效果,因为子视图和超级视图都具有相同的默认边距。我们声明子视图的左边缘应与超级视图的左边缘对齐。

在此处输入图片说明

保证金有什么好处

如果您决定使用边距,则此新功能(iOS8)仅影响UI开发。

通过使用边距,您可以通过更改单个属性的值来调整与共享超级视图具有共同关系的多个子视图的位置。这显然是将所有关联约束设置为固定值的一种成功方法,因为如果您需要更新所有间距,而不是一个一个地更改每个值,则可以通过单行更新超级视图的边距来同时修改所有相关的位置像这样的代码:

self.rootView.layoutMargins = UIEdgeInsetsMake(0, 50, 0, 0);

为了说明这种好处,在以下情况下,所有子视图的左边缘都与其父视图的左边缘对齐。因此,更改超级视图的左边界将同时影响所有子视图。

在此处输入图片说明


感谢您的详细说明。我将其标记为可接受的答案,因为这很好地说明了一切。
不丹·梅塔

谢谢@Bhumit,希望这个答案有帮助。
朱朱

4
“我根本不明白人们为什么抱怨”。好吧,也许行为随着最后一个beta的改变而改变了,我没有检查过。但是至少在几个月前,即使您没有尝试在代码中设置layoutMargins,也确实导致崩溃。
KPM

值得指出的是,当添加新的约束时,较新版本的Xcode允许您取消选中“约束到边距”复选框,该框设置了相同的“相对于边距”标志。这很有用,因为它节省了一些点击!顺便说一句很好的答案,所以解释得很好,图像非常有帮助。
EricWasTaken 2015年

我注意到这些图片托管在保管箱上。将图像托管在SO上会更好吗?
测试时间

63

在iOS 8中,您现在可以选择定义相对于超级视图范围的预定义边距的约束,而不是超级视图范围本身。是的,它与您在文档中指出的布局边距完全相关。一个优点是您可以动态地或针对每种设备不同地重新定义边距,并且布局将相应地更新而无需修改约束。

何时使用:何时要利用这种新的灵活性。

何时不使用它:适用于要在iOS 7或更低版​​本上运行的任何应用。


21
这将是一个不错的功能,如果它不是在默认情况下尚未引起任何东西彻底崩溃之前的iOS 8.启用,
TylerJames

1
完全同意。
KPM 2014年

42

UIView上的属性是:layoutMargins。请参阅Apple Docs。基本上,如果布局边距为8、8、8、8(默认值),则将0引导到容器边距的约束的x位置为8。请注意,这仅在iOS8或更高版本上可用。

对于每个不想让自己的约束走到容器边缘的人:

CTRL +单击+拖动以显示约束创建弹出窗口。

如果菜单显示默认情况下要对边距创建约束,请按住option / alt键以对容器而不是对容器边距进行约束。

现在它将显示创建约束而不是边缘的选项。这是WAY我的使用速度更快。


3
这可能是我在那里找到的最佳解决方案。取消选中“包含在边际”并不总是可行,并且感觉有些不可思议。太棒了。
Levi McCallum 2014年

为什么实际上默认值不是10pt?
ZaBlanc 2015年

11
Apple有根据可用性研究来选择长度和大小的历史,而不是通过选择我们喜欢阅读代码的数字来选择。例如,许多东西的默认高度为44或35磅。@ZaBlanc
凯尔·罗伯森

默认情况下,我在情节提要上添加约束而没有边距时的完美解决方案。谢谢!
2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.