为啥 UITableView 单元格 separatorInset 默认为 15,而视图控制器的根视图 Layout Margins 为 16?

Posted

技术标签:

【中文标题】为啥 UITableView 单元格 separatorInset 默认为 15,而视图控制器的根视图 Layout Margins 为 16?【英文标题】:Why UITableView cell separatorInset is default to 15, when view controller's root view Layout Margins is 16?为什么 UITableView 单元格 separatorInset 默认为 15,而视图控制器的根视图 Layout Margins 为 16? 【发布时间】:2016-05-02 12:33:18 【问题描述】:

在 iPhone 6s 上,当我将单元格分隔线左侧插入设置为 14 时,显示为 15,我认为这是因为它默认设置为 preservesSuperviewLayoutMargins = true

但来自苹果文档:“边距根据控制器的呈现方式和位置而有所不同,但可以是 16 或 20 点(取决于设备)。您无法更改这些边距。”

当我通过自动布局将视图添加到根视图的一侧并设置preservesSuperviewLayoutMargins = true时,从根视图的边缘到我添加的视图的距离在iPhone 6s上是16,所以它没有对齐到表格视图的左边缘。 UITableViewCell怎么能用preservesSuperviewLayoutMargins = true,边距是15,不是16?

【问题讨论】:

【参考方案1】:

看了一些日志,我知道为什么了,那是因为:

tableView.preservesSuperviewLayoutMargins = false

并且tableView的layoutMargins在iPhone 6上是(8, 15, 8, 15); (8, 20, 8, 20) 在 iPhone 6 Plus 上。

在苹果文档上只说:“默认边距是每边8个点,你可以根据你的应用需要修改这些边距。”

但是表格视图的 layoutMargins 在viewDidLoad() 上是 (8,8,8,8),然后在 iPhone 6 上更改为 (8, 15, 8, 15)。

当我想将视图左对齐添加到表视图并且子视图的左边缘左对齐到表视图分隔线时,这非常令人困惑。我不得不像这样更新视图:

override func viewDidLayoutSubviews() 
    super.viewDidLayoutSubviews()
    totalBar.preservesSuperviewLayoutMargins = tView.preservesSuperviewLayoutMargins
    totalBar.layoutMargins = tView.layoutMargins

这样我就不需要对 6 和 6 Plus 的边距值进行硬编码,甚至 Apple 将来也会更改该值。

【讨论】:

太棒了。

以上是关于为啥 UITableView 单元格 separatorInset 默认为 15,而视图控制器的根视图 Layout Margins 为 16?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能从 UITableView 单元格转到 detailView 工作?

UITableView 在 TableView 中间加载单元格。为啥?

为啥我不能在 uitableview 单元格中放置一个 nsarray

我在学习iOS的UITableView,为啥UITableView的最后一块单元格只能显示一半? [关闭]

为啥 UITableView 自定义单元格的第一个单元格总是在 Xcode 中的动作事件上被调用两次

为啥我的 UITableView 单元格的渐变子层没有正确显示?