设置UIView的layoutMargins不起作用

时间:2014-12-11 11:11:47

标签: ios objective-c uitableview ios8 autolayout

UIViewControllerUIViewUITableView

UIView
|-UITableView

我试图像这样设置边距:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.layoutMargins = UIEdgeInsetsMake(30, 30, 30, 30);
    self.tableView.preservesSuperviewLayoutMargins = YES;
    [self.view layoutIfNeeded];
}

但视图中没有发生任何事情。

以下是InterfaceBuilder的约束

(lldb) po self.view.constraints
<__NSArrayM 0x786ab6e0>(
<NSLayoutConstraint:0x7896e940 UIView:0x7896e470.trailingMargin == UITableView:0x79b51a00.trailing - 16>,
<NSLayoutConstraint:0x7896e970 UITableView:0x79b51a00.leading == UIView:0x7896e470.leadingMargin - 16>,
<NSLayoutConstraint:0x7896e9a0 V:[_UILayoutGuide:0x7896e510]-(0)-[UITableView:0x79b51a00]>,
<NSLayoutConstraint:0x7896e9d0 V:[UITableView:0x79b51a00]-(0)-[_UILayoutGuide:0x7896e600]>,
<_UILayoutSupportConstraint:0x7896c7d0 V:[_UILayoutGuide:0x7896e510(0)]>,
<_UILayoutSupportConstraint:0x7896c2b0 V:|-(0)-[_UILayoutGuide:0x7896e510]   (Names: '|':UIView:0x7896e470 )>,
<_UILayoutSupportConstraint:0x7896cbf0 V:[_UILayoutGuide:0x7896e600(0)]>,
<_UILayoutSupportConstraint:0x7896ea00 _UILayoutGuide:0x7896e600.bottom == UIView:0x7896e470.bottom>
)

因此没有看到任何边缘,没有任何改变......我发的是什么?

iOS 8

2 个答案:

答案 0 :(得分:38)

自定义layoutMargins不适用于作为UIViewController实例的根的视图。这些是由系统定义的,不能被覆盖。 您需要添加另一个包含所有内容的子视图,然后可以修改此新“contentView”的布局边距

更新

  

讨论

     

使用此属性指定视图边缘与任何子视图之间所需的空间量(以磅为单位)。   自动布局使用边距作为放置内容的提示。对于   例如,如果使用指定一组水平约束   格式字符串“| - [subview] - |”,子视图的左右边缘   通过相应的布局从superview的边缘插入   利润率。当视图的边缘靠近边缘时   superview和preservesSuperviewLayoutMargins属性是YES,   可以增加实际布局边距以防止内容   重叠superview的边缘。

     

默认边距为每边八个点。

     

如果视图是视图控制器的根视图,则系统设置和   管理利润。顶部和底部边距设置为零   点。侧边距取决于当前的尺寸等级,但是   可以是16或20分。您无法更改这些边距。

答案 1 :(得分:12)

iOS 11已更改此内容。在为此iOS版本进行部署目标设置时,自定义边距似乎运行良好。有一天,我们会嘲笑我们以前经历过的事情。

如果您想设置低于系统最小值的值(可能因设备而异) - 您还必须将viewRespectsSystemMinimumLayoutMargins设置为false(默认情况下为真)。

如果您定位iOS 10并且更低,则表示运气不佳,@ Reverend回答是正确的 - 没有针对viewcontroller的根视图进行布局边距自定义。