在Xcode 6的Storyboard中,“约束边界”是什么?

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

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

XCode 6你可以在这里看到,即使tableview与视图具有相同的框架XCodebuild议添加-16作为约束,而XCode 5将build议添加间距0。

限制边界检查

现在,如果取消选中“限制边距”选项,则performance与XCode 5相同,并build议将0作为约束条件

限制未检查的边界

此外,我发现,一旦我添加约束约束边缘检查,我不能再打开XCode 5故事板文件,所以这绝对是XCode 6中的新东西

希望我能够正确地解释我的问题。 我想了解什么“约束边缘”实际上做什么,什么时候我应该而不应该使用它。 我很抱歉,如果这是非常简单明了的事情。

编辑

我在这里讨论了一些关于布局利润的问题 ,我想知道这是否与此有关。

我根本不明白为什么人们抱怨说:“ 利润率会导致iOS 8之前的事情彻底崩溃 ”。

在xib文件或故事板中设置相对于页边距的约束不要让你的应用在iOS7上崩溃,也不要让你的iOS7设备的UI差别,只要你不触及UIView.layoutMarginsUIView.preservesSuperviewLayoutMargins在代码中UIView.preservesSuperviewLayoutMargins属性。

什么是iOS8的边距

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

在这里输入图像描述

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

您可以通过编辑器>canvas>显示布局矩形显示边距 在这里输入图像描述

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

如何使用边距

在Interface Builder中使用边距的唯一方法是在configuration约束时检查相对边距选项。 这是你如何指示你的约束来铺设我的看法时使用边距而不是边缘。

在这里输入图像描述

我们来看看在视图和子视图之间build立主要约束的四种不同的方法。 对于每个约束条件,我们回顾第一个描述关联将是子视图的领先第二个将是超视图的领导 。 您要密切关注的是每个约束结束的相对边距选项的检查和取消选中状态,因为它定义了约束是与边界还是边界相关联。

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

在这里输入图像描述

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

在这里输入图像描述

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

在这里输入图像描述

  1. 第一项(检查),第二项(检查)。 这实际上与案例2具有相同的效果,因为subview和superview都有相同的默认边距。 我们声明子视图的左边距应该与超视图的左边距alignment。

在这里输入图像描述

边距有什么好处

如果您决定使用页边距,这个新function(iOS8)只会影响UI开发。

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

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

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

在这里输入图像描述

在iOS 8中,您现在可以select将相对于预定义边距的约束定义到超级视图边界,而不是超级视图边界本身。 是的,这与您在文档中指出的版面边距完全相关。 一个优点是,您可以dynamic地重新定义您的利润率,或者为每种设备重新定义您的利润率,并且相应地更新布局而不修改约束条件。

什么时候使用它:当你想利用这个新的灵活性。

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

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

对于所有不希望受到限制的人来说,

CTRL +单击并拖动以显示约束创buildpopup窗口。

如果菜单默认显示为边界创build约束,请按住/ alt选项以允许对容器进行约束,而不是容器边界。

现在它将显示创build约束的选项。 这是我的使用方式更快。