【发布时间】:2016-08-01 17:12:15
【问题描述】:
我需要支持 iOS 8.1 和 8.2,但我不记得如何正确设置 layoutMargins,已经搜索了很多(在我自己的旧 Projecs、Google、SO、OpenRadar 中)。
从 iOS 8.3 开始,一切正常。
谁能指点我正确的方向?
对于自定义 Cell 和它的 contentView,我在 IB 中设置了“Preserve Superview Margins”。 “跟随可读宽度”(iOS9)已关闭。
在 iPad Air 2 模拟器上进行测试。
iOS 8.1 和 8.2(UILabel 左边距太小):
iOS 8.3 到 9.3(正确):
像往常一样自动布局,到 contentView (只是添加了顶部/底部 +3px):
试图通过代码检查 layoutMargins(在这个 Cell 类中),但它们是正确的。
这是完整的单元格类:
class TextLabelTableViewCell: UITableViewCell {
@IBOutlet weak var customTextLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
func configure(text: String?) {
customTextLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleBody)
customTextLabel.text = text
customTextLabel.accessibilityLabel = text
}
override func layoutSubviews() {
super.layoutSubviews()
debugPrint("layoutMargins: ", layoutMargins)
debugPrint("contentView.layoutMargins: ", contentView.layoutMargins)
debugPrint("separatorInsets: ", separatorInset)
/*
"layoutMargins: " __C.UIEdgeInsets(top: 8.0, left: 16.0, bottom: 8.0, right: 16.0) - 8, 16, 8, 16
"contentView.layoutMargins: " __C.UIEdgeInsets(top: 8.0, left: 16.0, bottom: 8.0, right: 16.0) - 8, 16, 8, 16
"separatorInsets: " __C.UIEdgeInsets(top: 0.0, left: 16.0, bottom: 0.0, right: 0.0) - 0, 16, 0, 0
*/
}
}
检查了显示中的单元格。一切都是正确的,除了 UILabel。这是上述单元格内标签的屏幕截图。帧 X 应为 16。
找到这个帖子:UITableViewCell with autolayout left margin different on iPhone and iPad
有趣的是对第一个并被接受的答案的评论:
所以我在 8.1 模拟器上试了一下,确实,边距也太大了 窄,意味着超级视图的布局边距不是 保留...但是这是 Apple 在 8.3 中修复的错误,并且 在 iOS 9 中以某种方式再次修复。 – Jonas Zaugg
好的,这是一个错误是显而易见的。但是您通常如何解决?这就是我忘记的。为 8.0 到 8.2 (UIAppearance ftw) 手动设置 layoutMargin 和 separatorInsets 的每个插图?
Sankalap Yaduraj Singh 建议的解决方案,为leadingMargin 设置一个额外的边距常量,不工作:
我发现:如果我通过 UIAppearance 将 layoutMargin 设置为大于设备默认值(通常在 iPad 上为 16,在 iPhone 上为 8),则正确应用较大的边距:
// Experimental: TableViewCells Margin Bugfix for iOS 8.0 to 8.2
UITableViewCell.appearance().layoutMargins = UIEdgeInsetsMake(8, 17, 8, 16)
请注意 17,而不是 iPad 上此测试的 16。
如前所述,这是一个已知的 iOS 8.1/8.2 错误。我已经知道了,问题是如何以干净的方式解决问题。
有趣的事实:如果我在 Reveal 中将 UILabel 的前导约束常数从 0 调整为 1 再回到 0,则位置是正确的。看起来这个 8.1/8.2 的 bug 是一个 AutoLayout 的 bug。
【问题讨论】:
标签: ios swift uitableview