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

时间:2015-03-30 15:16:40

标签: ios uitableview autolayout

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

我注意到,在iOS版本和运行它的设备之间,单元格的左对齐会发生变化。 似乎就像左对齐与默认单元格separatorInset相同。

以下是一些设备和iOS版本的UITableViewCell s separatorInset

  • iPad上7 - 15分。
  • iPad上8 - 20分。
  • iPhone 7 - 15分。
  • iPhone 8 - 16分。

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

您如何确保自定义单元格和内置单元格的标签左对齐?

是否有一种合理的方法来获取这些插入默认值并在故事板中设置的自动布局约束中使用它们?代码怎么样?

5 个答案:

答案 0 :(得分:34)

我遇到了同样的问题,但另一个答案对我没有帮助,因为我在UITableViewController中使用静态单元格。经过一些试错,我终于找到了一种方法来解决iPhone 6+上的separatorInset问题而无需一行代码。

enter image description here

我只是将UILabel的左边缘与左边距的值[内容视图(当前距离= 0)]对齐。并且还将UILabel的X位置更改为0.(对于我的情况,在Interface Builder中,边距为7,UILabel的X = 8)。对齐适用于iPhone 4S,5S,6和6 +。

编辑:这在XCode 7中发生了变化。 附加步骤:设置"保留Superview边距"各个单元格的TableViewCell及其contentView为TRUE或在IB中检查 - >大小检查员。请参阅@ tebs1200的答案。

希望这有帮助。

答案 1 :(得分:28)

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

  1. 确保选择了自定义单元格。

    Table View Cell selected in view tree

  2. 确保在尺寸检查器中选择保留Superview边距

    'Preserve Superview Margins' selected in the Size inspector

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

    enter image description here

  4. 确保此处也选择保留超级视图边距(请参阅步骤2中的图像。)

  5. 在自定义原型单元格中选择标签(或其他视图)。
  6. 从边距约束它的左边缘 0 像素。

    enter image description here

答案 2 :(得分:7)

对我来说有用的是将这2行添加到我的自定义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}]];

答案 3 :(得分:2)

在iOS8中,Apple推出了layoutMargins

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

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

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

  

preservesSuperviewLayoutMargins :一个布尔值,指示当前视图是否也尊重其超级视图的边距。

希望这可以帮到你;)

答案 4 :(得分:0)

这是几年后的事,我对上述解决方案没有任何运气。我发现将(情节提要)中的前导约束通常设置为16,将高度尺寸类.compact设置为20可以在各种设备上的iOS 13上正常使用。但是,对于较旧的iOS版本,我最终将该约束连接到自定义单元格的类并添加了以下内容:

    @IBOutlet var stackViewLeadingConstraint: NSLayoutConstraint!


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

更新:我担心这种方法可能会多么脆弱。对于我目前的情况,我意识到我可以使用各种系统tableView单元来满足要求,而无需混合使用自定义单元。看来可以解决对齐问题。