什么是“限制到边缘”;在Xcode 6的Storyboard中

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

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

< >强Xcode 6 你可以看到,尽管tableview和view有相同的帧Xcode建议添加-16作为约束,而Xcode 5建议添加空格0

With constraint to margin checked .

现在,当你取消勾选“约束到边缘”选项时,它的行为与Xcode 5相同,并建议添加0作为约束

With constraint to margin UnChecked

此外,我发现一旦我添加约束与约束边际检查,我不再能够打开故事板文件在Xcode 5,所以这肯定是新的东西在Xcode 6

希望我能正确地解释我的问题。我想了解什么“限制到边缘”实际上做的,当我应该和不应该使用它。如果是很简单很明显的问题,我很抱歉。

编辑

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

92939 次浏览

在iOS 8中,你现在可以选择定义你的约束相对于预定义的边界到父视图的边界,而不是父视图的边界本身。是的,这完全与你在文档中指出的版面边距有关。这样做的一个好处是,你可以动态地重新定义页边距,或者针对每种设备重新定义不同的页边距,并且布局将相应地更新,而无需修改约束。

何时使用它:当您想要利用这种新的灵活性时。

什么时候不使用:任何目标运行在iOS 7或以下的应用程序。

UIView的属性是:layoutMargins。参见苹果公司的文档。基本上,如果布局边距为8,8,8,8(默认值),那么容器边距为0的约束的x位置将为8。注意,这只适用于iOS8或更高版本。

对于那些不想将约束移到容器边距的人:

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

如果菜单显示默认情况下要创建对页边距的约束,则按住option/alt以允许对容器而不是容器页边距创建约束。

现在它将显示一个选项,用于在页边距上创建约束NOT。在我的使用中,这是道路更快。

我完全不明白为什么人们抱怨“在iOS 8之前,利润率会导致任何产品的彻底崩溃。"

在xib文件或故事板中设置相对于边缘的约束会使你的应用程序在iOS7上崩溃,并且它也会在你的iOS7设备上对UI产生影响,只要你不触及代码中的UIView.layoutMarginsUIView.preservesSuperviewLayoutMargins属性。

iOS8中什么是margin

布局边距表示布局系统在布局子视图时可以使用的围绕UIView室内的填充-以确保在视图的边缘和子视图之间留有空隙。在这方面,它很像CSS中与块相关的padding属性。

enter image description here

默认情况下,UIView的布局边距为每边8点,这不能在界面构建器中更改。然而,通过在代码中设置UIView.layoutMargins属性(仅在iOS8上可用),您可以调整这些值。

您可以使用Editor >帆布比;显示布局矩形: enter image description here

边距可以用来帮助布局视图和子视图。每个UIView默认都带有页边距,但只有当你设置了与页边距相关的约束时,它们才会影响视图的位置。

如何使用边距

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

enter image description here

让我们看一看在视图和它的子视图之间设置主要约束的四种不同方法。对于每个约束,我们检查描述的第一个关联将是子视图的导联其次将是superview的领先。你需要密切关注的是每个约束端相对于边缘选项的勾选和取消勾选状态,因为这定义了约束是绑定到视图的边缘还是边缘。

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

enter image description here

  1. 第一项(取消勾选),第二项(取消勾选):都使用edge, 没有利润。在本例中,我们声明子视图的左边缘应该对齐于父视图的左边缘。

enter image description here

  1. 第一项(勾选),第二项(取消勾选):在本例中,我们声明子视图的左边缘应该与父视图的左边缘对齐。这种布局实际上使子视图与父视图重叠。

enter image description here

  1. 第一项(勾选),第二项(勾选)。这实际上与情况2有相同的效果,因为子视图和父视图都有相同的默认边距。我们声明子视图的左距应该对齐于父视图的左距。

enter image description here

边际距有什么好处

这个新功能(iOS8)只在你决定使用边距时才会影响UI开发。

通过使用页边距,您可以通过更改单个属性的值来调整与共享父视图具有共同关系的多个子视图的位置。这显然比用固定值设置所有相关的约束更有优势,因为如果你需要更新所有的间距,而不是逐个更改每个值,你可以通过更新父视图的边距来同时修改所有相关的位置,就像下面一行代码:

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

为了说明这个好处,在下面的例子中,所有子视图的左边缘都对齐到它们的父视图的左边缘。因此,改变superview的左边缘将同时影响所有子视图。

enter image description here