【问题标题】:Setting layoutMargins of UIView doesn't work设置 UIView 的 layoutMargins 不起作用
【发布时间】:2015-02-09 20:31:40
【问题描述】:

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

【问题讨论】:

  • 如果在调用layoutIfNeeded 之前使用setNeedsUpdateConstraints 会怎样?我有一种感觉,更改 layoutMargins 不会将约束标记为脏。
  • here。有一个非iOS11的解决方案。我只是确定它是否是推荐的......

标签: ios objective-c uitableview ios8 autolayout


【解决方案1】:

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

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

如果您的目标是 iOS 10 或更低,那么您就不走运了,@Reverend 的答案是正确的 - 视图控制器的根视图没有布局边距自定义。

【讨论】:

  • 我认为这实际上是相反的。默认为真。将 viewRespectsSystemMinimumLayoutMargins 设置为 false 以设置您自己的边距。
  • viewRespectsSystemMinimumLayoutMargins 似乎适用于UIViewController,但我无法让它适用于UITableViewController。我可以将表格视图边距设置为比默认值更高的值(例如 64),但我不能将它们设置得更低,即使 viewRespectsSystemMinimumLayoutMargins 设置为 false。有没有其他人看到这种行为?看起来像一个错误。
【解决方案2】:

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

更新:

讨论

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

默认边距是每边八点。

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

【讨论】:

  • 很好——就像一个魅力!你有这个的来源吗?我很想阅读更多关于它的内容。
  • 我不知道如何获取 Xcode 中文档的链接,但我会从 UIView 文档中复制粘贴它。见上文
  • 我真的看不出苹果执行此操作背后的原因。当您通常希望在您的内容周围始终保持一致的边缘时,让侧面根据设备进行调整有什么意义,但顶部和底部保持不变,以及为什么在添加约束时默认“约束到边距”复选框为真太没用了。
  • 越来越多的东西在 iOS 上没有意义。这是一个例子,自定义 UITableView 的外观是另一个例子。
  • 我真的不明白苹果为什么要这么做。我经常以编程方式编写约束,将子视图的边缘固定到其父视图的边缘。期望边距可用于控制这些视图的边缘填充。不幸的是,如果视图恰好是根视图,它将无法工作。
猜你喜欢
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 2018-06-10
  • 2012-01-13
相关资源
最近更新 更多