我正在使用自动布局和约束,发现Xcode 6中有一个约束到页边距选项,这在Xcode 5中不存在,默认情况下是选中的。

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

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

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

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

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

EDIT

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


当前回答

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

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

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

其他回答

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

在xib文件或storyboard中设置相对于边距的约束不会让你的应用在iOS7上崩溃,也不会让你的iOS7设备上的UI发生变化,只要你不碰UIView。layoutmargin和UIView。代码中的preservessuperviewlayoutmargin属性。

iOS8中什么是margin

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

默认情况下,UIView每边的布局边距为8点,这不能在Interface Builder中更改。不过,通过设置UIView。layoutmargin属性在代码中,这只在iOS8上可用,你可以调整这些值。

你可以使用编辑器> Canvas >显示布局矩形来显示页边距:

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

如何使用边距

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

让我们看一看在视图和它的子视图之间设置主要约束的四种不同方法。对于我们回顾的每个约束,描述的第一个关联将是子视图的前导,第二个关联将是父视图的前导。您需要密切关注的是每个约束端“相对于边距”选项的勾选和取消勾选状态,因为这定义了约束是绑定到视图的边距还是绑定到视图的边缘。

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

第一项(取消勾选),第二项(取消勾选):都使用边,而不是边距。在本例中,我们声明子视图的左边缘应该对齐于父视图的左边缘。

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

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

边际距有什么好处

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

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

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

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

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

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

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

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

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

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

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

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