什么是Xcode 6中的Storyboard中的"约束到边距"

Bhu*_*hta 247 xcode storyboard ios autolayout xcode6

我正在使用自动布局和约束,并发现Constrain to marginsXCode 6中有一个选项,它在XCode 5中不存在,默认情况下会被选中.

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

XCode 6 你可以看到这里,即使tableview具有与视图相同的帧,XCode建议添加-16作为约束,而XCode 5会建议添加间距0.

使用Constrain进行保证金检查

现在,当您取消选中"Constrain to margin"选项时,它的行为与XCode 5相同,并建议将0添加为约束

使用Constrain来保证UnChecked

另外,我发现一旦我用Constrain添加约束来检查边距,我就不能再在XCode 5中打开storyboard文件了,所以它绝对是XCode 6中的新东西.

希望我能够正确地解释我的问题.我想了解"限制边际"实际上是什么以及何时应该而且不应该使用它.如果它非常简单明了,我会道歉.

编辑

我在这里讨论了一些关于布局边距的内容,我想知道它是否与此相关.

Sco*_*Zhu 310

我完全不明白为什么人们抱怨" 在iOS 8之前,Margins会导致任何事情彻底崩溃 ".

在xib文件或故事板中设置相对于边距的约束不会使您的应用在iOS7上崩溃,并且它也不会在您的iOS7设备上产生UI差异,只要您不触及代码中的UIView.layoutMarginsUIView.preservesSuperviewLayoutMargins属性即可.

什么是iOS8中的Margins

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

在此输入图像描述

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

您可以使用" 编辑器">"画布">"显示布局矩形"来显示IB以显示边距: 在此输入图像描述

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

如何使用边距

在Interface Builder中使用边距的唯一方法是在配置约束时检查" 相对边距"选项.这是在布局视图时将约束引导到使用边距而不是边缘的方法.

在此输入图像描述

让我们看一下在视图及其子视图之间设置前导约束的四种不同方法.对于每个约束,我们检查所描述第一个关联将是子视图的领先,第二个将是superview的领先.您要密切关注的是每个约束结束的相对于边距选项的检查和取消选中状态,因为它定义约束是否与边距或视图边缘相关联.

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

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

Margins有什么好处

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

通过使用边距,您可以通过更改单个属性的值来调整与共享超级视图共享共同关系的多个子视图的放置.这明确胜过用固定值设置所有相关约束,因为如果您需要更新所有间距,而不是逐个更改每个值,您可以通过使用单行更新superview的边距来同时修改所有相关放置像这样的代码:

self.rootView.layoutMargins = UIEdgeInsetsMake(0, 50, 0, 0);
Run Code Online (Sandbox Code Playgroud)

为了说明这种好处,在下面的例子中,所有子视图的左边缘都与其超视图的左边距对齐.因此,更改superview的左边距将同时影响所有子视图.

在此输入图像描述

  • "我根本不明白为什么人们在抱怨".好吧,也许这个行为随着最后一个测试版之一改变了,我还没有检查过.但至少在几个月前,即使您没有尝试在代码中设置layoutMargins,它确实会导致崩溃. (4认同)

KPM*_*KPM 63

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

何时使用它:当你想利用这种新的灵活性时.

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

  • 如果它在默认情况下未启用并且在iOS 8之前导致任何事情彻底崩溃,那么这将是一个很好的功能. (21认同)

Kyl*_*son 42

UIView的财产是:layoutMargins.请参阅Apple Docs.基本上,如果布局边距是8,8,8,8(默认值),则带有0前导空间到容器边距的约束将具有x位置8. 请注意,这仅适用于iOS8或更高版本.

对于不希望他们的约束进入容器边距的每个人:

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

如果菜单显示默认情况下创建约束到边距,请按住选项/ alt以允许对容器进行约束而不是容器边距.

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

  • Apple有根据可用性研究选择长度和大小的历史,而不是选择我们阅读代码可能更喜欢的数字.例如,许多东西的默认高度是44或35磅.@ZaBlanc (11认同)
  • 这可能是我在那里发现的最佳解决方案.取消选中"保持边际"并不总是有效,感觉有点过于神奇.太棒了. (3认同)