匹配自定义和标准 UITableViewCell 类型的左对齐

Matching left alignment of custom & standard UITableViewCell types

我正在故事板中定义自定义 UITableViewCell。我还使用了一些内置的标准样式单元格。我需要设置约束,以便我的 自定义单元格与平台定义的单元格匹配 (它们的标题在左侧正确对齐)。

我注意到单元格的左对齐在 iOS 版本和 运行 所在的设备之间发生变化。 似乎 左对齐与默认单元格 separatorInset.

相同

这里是 UITableViewCells separatorInset 一些设备和 iOS 版本:

其他设备(iPhone 6+,iPad Mini)可能不同——我没有详尽检查。

您将如何确保自定义单元格和内置单元格的标签具有相同的左对齐方式?

是否有一种明智的方法来获取这些默认插图并将它们用于故事板中设置的自动布局约束?在代码中怎么样?

在 iOS8 Apple 推出 layoutMargins

您可以像这样在故事板或代码中设置它:

cell.layoutMargins = UIEdgeInsetsZero // change by your custom value

在此之前,您必须将 preservesSuperviewLayoutMargins 设置为 NO 防止单元格继承 Table 视图的边距设置

preservesSuperviewLayoutMargins : A Boolean value indicating whether the current view also respects the margins of its superview.

希望对您有所帮助 ;)

我遇到了同样的问题,但其他答案对我没有帮助,因为我在 UITableViewController 中使用静态单元格。经过几次反复试验,我终于找到了一种无需一行代码即可解决 iPhone 6+ 上的 separatorInset 问题的方法。

我只是将 UILabel 的左边缘与距左边距 0 [Content View (current distance = 0)] 的值对齐。并且还将 UILabel 的 X 位置更改为 0。(对于我的情况,在 Interface Builder 中,边距为 7,UILabel 的 X = 8)。对齐在 iPhone 4S、5S、6 和 6+ 上运行良好。

编辑:这在 XCode 7 中发生了变化。 附加步骤:将相应单元格的 TableViewCell 及其 contentView 的 "Preserve Superview Margins" 设置为 TRUE 或在 IB -> Size Inspector 中检查它。参考@tebs1200的回答

希望这对您有所帮助。

对我有用的是将这两行添加到我的自定义 UITableViewCell 实现中:

self.preservesSuperviewLayoutMargins = YES;
self.contentView.preservesSuperviewLayoutMargins = YES;
// ... add test view to content view...

然后我使用默认间距的自动布局:

[self.contentView addConstraints:[NSLayoutConstraint 
  constraintsWithVisualFormat:@"H:|-[testView]-|" options:0 metrics:nil 
   views:@{@"testView":testLabel}]];

[self.contentView addConstraints:[NSLayoutConstraint 
  constraintsWithVisualFormat:@"V:|-[testView]-|" options:0 metrics:nil 
   views:@{@"testView":testLabel}]];

您可以完全在故事板中实施 Mark 建议的解决方案:

  1. 确保自定义单元格已 selected。

  2. 确保 Preserve Superview Margins 在尺寸检查器select中被编辑

  3. 现在 select 单元格的内容视图

  4. 确保 Preserve Superview Margins 也在此处 selected(参见步骤 2 中的图像。)

  5. Select 自定义原型单元格中的标签(或其他视图)。
  6. 限制它的左边缘距边距 0 像素。

这是几年后的事了,我对上述解决方案没有任何运气。我发现将前导约束(在故事板中)设置为 16 一般和 20 高度尺寸 class .compact 适用于各种设备上的 iOS 13。但是,对于较旧的 iOS 版本,我最终将该约束连接到自定义单元格的 class 并添加:

    @IBOutlet var stackViewLeadingConstraint: NSLayoutConstraint!


    override func layoutSubviews() {
        super.layoutSubviews()
        guard #available(iOS 13, *)
            else {
                if traitCollection.verticalSizeClass == .compact {
                    stackViewLeadingConstraint.constant = 16
                }
                return
        }
    }

更新:我对这种方法的脆弱性感到紧张。对于我目前的情况,我意识到我可以使用各种系统 tableView 单元格来满足要求,而无需混合自定义单元格。这似乎解决了对齐问题。