首页 文章

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

提问于
浏览
232

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

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

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

With Constrain to margin checked

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

With Constrain to margin UnChecked

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

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

EDIT

我在discussion here找到了关于布局边距的一些内容,我想知道它是否与此有关 .

3 回答

  • 301

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

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

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

  • 62

    UIView的 property 是: layoutMargins . 见Apple Docs . 基本上,如果布局边距是8,8,8,8(默认值),则带有0前导空间到容器边距的约束将具有8的x位置. Note that this is only available on iOS8 or later.

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

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

    If the menu shows to create the constraint to the margin by default, hold down option/alt to allow the constraint to be made to the container and not the container margin.

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

  • 42

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

    在xib文件或故事板中设置相对于边距的约束不会让你的应用在iOS7上崩溃,并且它也不会在iOS7设备上造成UI差异,只要你不触及UIView.layoutMargins和UIView .preservesSuperviewLayoutMargins代码中的属性 .

    iOS8中的边距是什么?

    布局边距表示布局系统在布局子视图时可以使用 UIViewinterior 周围的填充 - 以确保在视图边缘和子视图之间留有间隙 . 在这方面,它非常类似于与CSS中的块相关联的填充属性 .

    enter image description here

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

    您可以通过编辑器>画布>显示布局矩形让IB显示边距:

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

    如何使用边距

    在Interface Builder中使用边距的唯一方法是在配置约束时检查 Relative to margin 选项 . 这是在布局视图时将约束指向“使用边距而不是边缘”的方法 .

    enter image description here

    让我们看一下在视图及其子视图之间设置前导约束的四种不同方法 . 对于每个约束,我们检查 first association described will be the subview's leadingsecond will be superview's leading . 您要密切关注的是每个约束结束的 Relative to margin 选项的检查和取消选中状态,因为它定义约束是否与边距或视图边缘相关联 .

    • 第一项(取消选中),第二项(检查):在这种情况下,我们're declaring that subview'的左边缘应与superview的左边距对齐(如此图所示) .

    enter image description here

    • 第一项(取消选中),第二项(取消选中):两者都使用edge, not margin . 在这种情况下,我们're declaring that subview'的左边缘应与superview的左边缘对齐 .

    enter image description here

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

    enter image description here

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

    enter image description here

    Margins有什么好处

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

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

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

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

    enter image description here

相关问题