以编程方式添加具有相对约束问题的标签

Posted

技术标签:

【中文标题】以编程方式添加具有相对约束问题的标签【英文标题】:Adding programmatically label with relative constraint issue 【发布时间】:2019-04-04 11:08:27 【问题描述】:

我有一个带有一些单元格的UITableView,我想在第一个单元格中添加多个UILabel。这就是我在UITableViewCell 子类(在cellForRowAt 中调用)的函数中使用的代码:

    ...
let constantTop = 16


    for (index,optional) in optionals.enumerated()
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.text = "\(optional.name)"
        label.tag = 10010132
        label.font = CocoFonts.semibold(size: 15)
        label.textColor = CocoColors.FedericoMalagoni.textVeryDarkBlue

        self.contentView.addSubview(label)
        let constant:CGFloat = CGFloat(constantTop * (index + 1))

        print(constant)

        let horizontalConstraint = NSLayoutConstraint(item: label, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: self.contentView, attribute: NSLayoutAttribute.leading, multiplier: 1, constant: 16)

        let verticalConstraint = NSLayoutConstraint(item: label, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, toItem: self.contentView, attribute: NSLayoutAttribute.trailing, multiplier: 1, constant: 16)

        let height = NSLayoutConstraint(item: label, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 20)


        let top = NSLayoutConstraint(item: label, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: self.lblInfo, attribute: NSLayoutAttribute.bottomMargin, multiplier: 1, constant: constant)

        let bottom = NSLayoutConstraint(item: label, attribute: NSLayoutAttribute.bottom, relatedBy: NSLayoutRelation.equal, toItem: self.contentView, attribute: NSLayoutAttribute.bottom, multiplier: 1, constant: constant)


        NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, top, bottom, height])

    
    self.contentView.setNeedsUpdateConstraints()
    self.contentView.setNeedsLayout()
    self.contentView.layoutIfNeeded()
...

现在, 标签位于单元格的边缘,如下所示:

灰色分隔符划分单元格。 本质上,单元格的高度不会更新。

【问题讨论】:

【参考方案1】:

如果您可以共享 cellForRowAt 的完整实现,那就更清楚了。 我遇到了单元格内容重叠的类似问题。我正在将自定义视图作为子视图添加到单元格中。

这是因为表格视图重新使用了它的单元格。因此,一种解决方案是在添加新标签之前从单元格中删除旧标签。

for content in cell.contentView.subviews 
   content.removeFromSuperview()
 

【讨论】:

我将提供一个新的屏幕截图,以便您更好地理解 是的,如果您提供 cellForRowAtIndexPath 方法的完整实现细节,这将非常有帮助。我认为您的问题与我的问题相似。

以上是关于以编程方式添加具有相对约束问题的标签的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式向已以编程方式添加到表格单元格的标签添加约束

如何以编程方式向 xib 添加约束

以编程方式添加具有约束的多个子视图会引发异常

如何以编程方式添加标签并以编程方式使用自动布局定位它

以编程方式向导航控制器添加自动布局约束

以编程方式添加约束会导致崩溃