UIViewController
与UIView
和UITableView
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
答案 0 :(得分:38)
自定义layoutMargins不适用于作为UIViewController实例的根的视图。这些是由系统定义的,不能被覆盖。 您需要添加另一个包含所有内容的子视图,然后可以修改此新“contentView”的布局边距
更新
讨论
使用此属性指定视图边缘与任何子视图之间所需的空间量(以磅为单位)。 自动布局使用边距作为放置内容的提示。对于 例如,如果使用指定一组水平约束 格式字符串“| - [subview] - |”,子视图的左右边缘 通过相应的布局从superview的边缘插入 利润率。当视图的边缘靠近边缘时 superview和preservesSuperviewLayoutMargins属性是YES, 可以增加实际布局边距以防止内容 重叠superview的边缘。
默认边距为每边八个点。
如果视图是视图控制器的根视图,则系统设置和 管理利润。顶部和底部边距设置为零 点。侧边距取决于当前的尺寸等级,但是 可以是16或20分。您无法更改这些边距。
答案 1 :(得分:12)
iOS 11
已更改此内容。在为此iOS版本进行部署目标设置时,自定义边距似乎运行良好。有一天,我们会嘲笑我们以前经历过的事情。
如果您想设置低于系统最小值的值(可能因设备而异) - 您还必须将viewRespectsSystemMinimumLayoutMargins
设置为false(默认情况下为真)。
如果您定位iOS 10
并且更低,则表示运气不佳,@ Reverend回答是正确的 - 没有针对viewcontroller的根视图进行布局边距自定义。