Swift UITableViewCell在cellForRowAtIndexPath之后无法设置其约束

时间:2018-05-14 10:29:58

标签: ios swift uitableview nslayoutconstraint

在我的tableViewController中,我使用一个自定义单元格,其中包含一个imageView,两个标签和一些其他不相关的元素。还有一个约束条件,如果给出某个条件,则应改变常数值。这在第一眼看上去很好但是如果我向下滚动并获得约束常数被设置为另一个值的单元格,则下面的一些单元格会保持这个前一个单元格的常量,并且在出现时不要设置它。

这是我的cellForRowAtIndexpath的相关部分:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let identifier = whichCellToShow ? "ThisCell" : "TheOtherCellCell"

    //...

    let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath)

    if let customCell = cell as? CustomCellProtocol,
       indexPath.section < data.count,
       indexPath.row < data[indexPath.section].count {

        customCell.display(data: data[indexPath.section][indexPath.row])
    }

    return cell
}

这些是我的自定义单元格类的相关部分:

class CustomCell: UITableViewCell, CustomCellProtocol {
@IBOutlet weak var picture: UIImageView!
@IBOutlet weak var title: UILabel!
@IBOutlet weak var weblink: UILabel!
@IBOutlet weak var titleIndentationConstraint: NSLayoutConstraint!
//...

    func display(data: Data) {

        //...

        title.text = data.title

        //...

        weblink.text = data.hasWeblink ? URLUtilities.hostOfURL(urlstr: data.sourceUrl) : nil
        weblink.isHidden = !data.hasWeblink
        //This is the spot where things seem to go wrong
        titleIndentationConstraint.constant = data.hasWeblink ? weblink.frame.height : 0
        setNeedsLayout()
        layoutIfNeeded()
    }
}

如果data.hasWeblink == true约束常量应等于weblink标签的高度,如果它是假的,则它应为0.

我的第一个想法是,UITableView的视图回收可能会与titleIndentationConstraint.constant = data.hasWeblink ? weblink.frame.height : 0发生冲突。这就是我之后直接拨打setNeedsLayout()layoutIfNeeded()的原因,但这似乎没有帮助。细胞的所有其他元素都能正常工作。

另外,我在tableViewController的tableView.rowHeight内设置了tableView.estimatedRowHeightviewDidLoad()

有没有人知道那里出了什么问题或者我忘了做什么?先谢谢你!

1 个答案:

答案 0 :(得分:-1)

我自己修正了,不得不改变标题标签的一些约束优先级:

我的标题标签有一个底部约束,它总是大于或等于8分。此外,我将行数限制为4,并告诉标签截断文本的尾部,如果它太长而无法显示。有趣的是,如果文本被截断,我得到了上面描述的这种愚蠢的行为,所以它与我的titleIndetantionConstraint完全无关。似乎文本必须被截断,标签与底部约束对齐,并将拖动内容向左居中(请在属性编辑器中查看内容模式所示) ,它应该默认保留)。虽然改变标签的内容模式对我来说似乎是一个坏主意,但我将标题标签底部约束的优先级降低了1,因此它将自己对齐到图片的顶部,就像我一样计划。希望这有助于人们如何遇到类似的问题B)。