我在故事板中定义自定义UITableViewCell
。我也使用了一些内置的标准样式单元格。我需要设置约束,以便我的自定义单元格与平台定义的单元格匹配(在左侧正确对齐标题)。
我注意到,在iOS版本和运行它的设备之间,单元格的左对齐会发生变化。 似乎就像左对齐与默认单元格separatorInset
相同。
以下是一些设备和iOS版本的UITableViewCell
s separatorInset
:
其他设备(iPhone 6 +,iPad Mini)可能有所不同 - 我没有详尽检查过。
您如何确保自定义单元格和内置单元格的标签左对齐?
是否有一种合理的方法来获取这些插入默认值并在故事板中设置的自动布局约束中使用它们?代码怎么样?
答案 0 :(得分:34)
我遇到了同样的问题,但另一个答案对我没有帮助,因为我在UITableViewController中使用静态单元格。经过一些试错,我终于找到了一种方法来解决iPhone 6+上的separatorInset
问题而无需一行代码。
我只是将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建议的解决方案:
答案 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单元来满足要求,而无需混合使用自定义单元。看来可以解决对齐问题。