我有一个带有静态内容的自定义UITableViewCell,它具有一个UIStackView作为内容视图的单个子视图。我希望UIStackView在从iOS 9(我的最低部署目标)到当前的iOS 14以及iPhone和iPad设备上的所有iOS版本中,都使用与UIKit内置的标准UITableViewCell相同的水平边距/插入。
我天真地开始添加约束,这些约束将UIStackView的前导/尾随锚附加到内容视图的readableContentGuide
。我不喜欢Interface Builder,所以我的代码是这样的:
UIStackView stackView = [...]
[stackView.leadingAnchor constraintEqualToAnchor:self.contentView.readableContentGuide.leadingAnchor].active = YES;
[stackView.trailingAnchor constraintEqualToAnchor:self.contentView.readableContentGuide.trailingAnchor].active = YES;
除某些情况(1)中不使用标准UITableViewCell之外,此方法效果很好。readableContentGuide
因此,将标准单元格与我的自定义单元格混合会很糟糕,因为它们的边缘不对齐。在这里,您会看到4个自定义单元,顶部和底部有一个标准单元:
(1)在以下情况下会发生:
我尝试使用layoutMarginsGuide
代替readableContentGuide
,但是这会导致许多约束错误(Xcode的调试输出中出现“无法同时满足约束。”)。我也尝试设置
self.tableView.cellLayoutMarginsFollowReadableWidth = YES;
在使用我的自定义单元格的表格视图中,由于标准单元格现在其边缘与我的自定义单元格位于同一位置,因此此方法有效。但是我不喜欢这种解决方法,首先是因为这意味着我必须为要使用自定义单元格的每个表视图进行特殊设置,其次是因为不必要地减少了可用于数据显示的宽度。
看来我缺少了一些东西。是否有一种简单的标准方法,如何使用布局指南来布局自定义UITableViewCell的内容,以使自定义单元格内容的边缘与标准单元格的边缘在同一位置?
您应该可以使用单元格的.contentView.layoutMarginsGuide
:
UILayoutGuide *g = self.contentView.layoutMarginsGuide;
[NSLayoutConstraint activateConstraints:@[
[stackView.topAnchor constraintEqualToAnchor:g.topAnchor],
[stackView.leadingAnchor constraintEqualToAnchor:g.leadingAnchor],
[stackView.trailingAnchor constraintEqualToAnchor:g.trailingAnchor],
[stackView.bottomAnchor constraintEqualToAnchor:g.bottomAnchor],
]];
如果这样使您看到“无法同时满足约束”消息,但布局看起来正确(这在单元格中使用堆栈视图时很常见),则可以忽略消息或为底部锚点提供低于所需优先级的优先级:
UILayoutGuide *g = self.contentView.layoutMarginsGuide;
NSLayoutConstraint *c = [stackView.bottomAnchor constraintEqualToAnchor:g.bottomAnchor];
c.priority = UILayoutPriorityDefaultHigh;
[NSLayoutConstraint activateConstraints:@[
[stackView.topAnchor constraintEqualToAnchor:g.topAnchor],
[stackView.leadingAnchor constraintEqualToAnchor:g.leadingAnchor],
[stackView.trailingAnchor constraintEqualToAnchor:g.trailingAnchor],
c,
]];
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句