【问题标题】:UILabel Autolayout ignores UITableViewCell's left margin on iOS 8.1 and 8.2UILabel Autolayout 在 iOS 8.1 和 8.2 上忽略 UITableViewCell 的左边距
【发布时间】: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


    【解决方案1】:

    2016 年 4 月 26 日更新

    虽然下面的删除线文本在某种程度上是有效的,但并不是那么简单。 UITableViewCells 中的 AutoLayout 在 iOS 8.1/8.2 中已损坏,而对于任何早于 iOS 9 的版本都存在问题。期间。

    我创建了一个带有两个简单多行标签(上/下)的小演示,都保留了超级视图边距。在 iOS 8.1/8.2 下,它们不保留长文本的超级视图边距,并且旋转时高度不正确。

    Apple UIKit 开发人员 Tyler Fox 的演示存储库中也存在同样的问题: https://github.com/smileyborg/TableViewCellWithAutoLayoutiOS8

    我对该回购的问题: https://github.com/smileyborg/TableViewCellWithAutoLayoutiOS8/issues/39

    仍在寻求帮助..

    弗雷德里克

    回答我自己的问题:一如既往,魔鬼在细节中。

    viewWillAppear 中的常用 .ReloadData() 足以在 iOS 8(尤其是 8.1/8.2)中修复 UITableView 的 AutoLayout,除了 - 这就是我的问题中所有 AutoLayout 错误的原因:

    当您在 UISplitViewController 中使用 UITableView 将 UISplitViewController 的 preferredPrimaryColumnWidthFraction 更改为大于默认值 (iirc 0.4) 的其他值。

    即使只更改一次主列宽,在添加了splitViewController?.setNeedsLayout()splitViewController?.layoutIfNeeded()viewDidLoad() 中,如果您使用动态大小的UITableViewCellsUILabels 显示长文本。

    干杯,感谢您  进行了长时间的调试;)

    附:附带说明一下,与代码相比,我也能够观察到 IB 中的 preservesSuperviewLayoutMargins 设置差异。如果您难以打开它们,请在 IB 中进行。将它们设置在awakeFromNib() 中的UITableViewCellscontentView 的行为不同,至少对于我们需要支持一段时间的iOS 8..

    【讨论】:

      【解决方案2】:

      您可以在自动布局的帮助下设置左边距。

      看下面的图片。

      【讨论】:

      • 这有什么帮助?我已经在使用leadingMargin 自动适配每台设备,并与默认的separatorInsets 保持同步。适用于 8.3 到 9.3。我需要知道的是如何修复 iOS 8.1/8.2 关于leadingMargin 不被尊重的错误。
      • 您的解决方案不起作用,我会相应地更新我的问题。刚刚尝试过,现在投票否决。
      • 我用 iOS 8.1/8.2 开发了这个项目。我没有遇到任何关于自动布局的问题。
      • 嗯,这是一个已知的错误。可能您在某处将 layoutMargins 和/或 separatorInsets 设置为 UIEdgeInsetsZero (或硬编码值)?你能检查一下吗?无论如何,上面发布的内容并不能解决问题。
      猜你喜欢
      • 2020-09-22
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 2013-08-18
      • 1970-01-01
      相关资源
      最近更新 更多