什么是"限制到保证金"在Xcode 6的故事板中

时间:2014-09-12 11:42:53

标签: ios xcode storyboard autolayout xcode6

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

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

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

With Constrain to margin checked

现在取消选中"约束边距"选项它的行为与XCode 5相同,并建议将0添加为约束

With Constrain to margin UnChecked

另外,我发现一旦我使用Constrain添加约束来检查边距,我就无法再在XCode 5中打开storyboard文件,所以它在XCode 6中肯定是新的东西

希望我能够正确解释我的问题。我想了解"约束边缘"实际上,当我应该而且不应该使用它时。如果它非常简单明了,我会道歉。

修改

我在discussion here找到了关于版面边距的内容,我想知道它是否与此相关。

3 个答案:

答案 0 :(得分:306)

我根本不明白为什么人们抱怨" Margins会导致iOS 8之前的任何事情彻底崩溃。"

  

在xib文件或故事板中设置相对于边距的约束不会使您的应用在iOS7上崩溃,并且不会在您的iOS7设备上创建UI差异两者都没有,只要您不接触代码中的UIView.layoutMarginsUIView.preservesSuperviewLayoutMargins属性。

iOS8中的边距是什么

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

enter image description here

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

  

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

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

如何使用边距

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

enter image description here

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

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

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

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

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

          Margins有什么好处

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

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

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

          为了说明这种好处,在以下情况下,所有子视图都是'左边缘与其超视图的左边距对齐。因此,更改超级视图的左边距将同时影响所有子视图。

          enter image description here

答案 1 :(得分:62)

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

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

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

答案 2 :(得分:42)

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

对于那些不希望他们的约束进入容器边缘的人:

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

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

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