繁体   English   中英

UITableView 单元格约束问题 - Swift

[英]UITableView cell constraints problem - Swift

我开始收到此约束错误:

"<NSLayoutConstraint:0x6000014419a0 V:|-(20)-[UIImageView:0x7f809779fae0]   (active, names: '|':mChat.ChatCell:0x7f8097534600'ChatCell' )>",
    "<NSLayoutConstraint:0x600001441b30 UIImageView:0x7f809779fae0.bottom == mChat.ChatCell:0x7f8097534600'ChatCell'.bottom - 20   (active)>",
    "<NSLayoutConstraint:0x600001440eb0 UIImageView:0x7f809779fae0.height == 150   (active)>",
    "<NSLayoutConstraint:0x600001440550 'UIView-Encapsulated-Layout-Height' mChat.ChatCell:0x7f8097534600'ChatCell'.height == 60.5   (active)>"

当 UITableView 中至少有两个图像时会出现问题,然后我收到这些约束错误。 或者当我向 UITableView 添加另一个图像时。 这是我的限制条件:

func setupMediaMessage(){

        mediaMessage.translatesAutoresizingMaskIntoConstraints = false
        mediaMessage.contentMode = .scaleAspectFill
        mediaMessage.backgroundColor = .lightGray
        mediaMessage.layer.cornerRadius = 16
        mediaMessage.layer.masksToBounds = true
        let constraints = [
            mediaMessage.topAnchor.constraint(equalTo: topAnchor, constant: 20),
            mediaMessage.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -20),
            mediaMessage.widthAnchor.constraint(equalToConstant: 150),
            mediaMessage.heightAnchor.constraint(equalToConstant: 150)
        ]
        outcomingConstraint = mediaMessage.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 24)
        incomingConstraint = mediaMessage.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -24)
        NSLayoutConstraint.activate(constraints)
}

不要担心尾随和前导约束,我只是检查这些图像是传入还是传出。 我的 Github 存储库: https : //github.com/realpaliy/mChat/blob/master/mChat/Controllers/Chats/ChatCell.swift 所以, UITableView 看起来不错,但为什么我会收到这些错误? 上海

如果布局看起来正确,则冲突可能是由于内部自动布局引擎以及约束评估的顺序造成的。

试试这个——它应该消除警告,而不改变最终结果:

    let bAnchor = mediaMessage.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -20)
    bAnchor.priority = UILayoutPriority(rawValue: 999)
    let constraints = [
        mediaMessage.topAnchor.constraint(equalTo: topAnchor, constant: 20),

        //mediaMessage.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -20),
        bAnchor,

        mediaMessage.widthAnchor.constraint(equalToConstant: 150),
        mediaMessage.heightAnchor.constraint(equalToConstant: 150)
    ]

编辑

注意:我不为 Apple 工作 - 这些只是我的观察:

当单元格被实例化和/或出列时,自动布局使用当前行高来布局单元格内容。 然后它使用对单元格内容的约束来确定实际的行高。 如果行对于生成的高度不够高,这可能会导致冲突警告。 通过将最底部约束的优先级 - 或者,我相信,在显式元素高度约束上 - 更改为 999,这允许自动布局首先打破约束,然后重新实施它......而不会产生调试警告。

您应该(可能?)还可以通过为tableView.estimatedRowHeight设置足够大的值来消除警告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM