设置UIView的layoutMargins不起作用

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 ( , , , , , , ,  ) 

结果没有看到任何边缘,没有任何改变….我正在发布什么?

iOS 8

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

更新:

讨论

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

默认边距为每边八个点。

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

这已针对iOS 11进行了更改。 在为此iOS版本进行部署目标设置时,自定义边距似乎运行良好。 有一天,我们会嘲笑我们之前的经历。

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

如果您的目标是iOS 10及更低版本,那么您的运气不佳,@ Reverend答案是正确的 – 没有针对viewcontroller根视图的布局边距自定义。