无法在tableViewcell中设置UILabel填充

时间:2017-06-06 11:34:13

标签: ios iphone swift uitableview uilabel

我使用StackOverflow的popular thread设置了我的UILabel填充,以解决自动布局问题。 该线程基本上是UILabel扩展。

部分答案是:

.container{
  width: 98%;
  border: 2px solid #f00;
  padding: 10px;
}

.left {
    width: 47%;
    float: left;
    margin: 0 1% 0 1%;
    border: 1px solid green;
}


.right {
    width: 47%;
    float: left;
    margin: 0 1% 0 1%;
    border: 1px solid green;
}

.inner-text{
  text-align:center;
}

.image{
  padding: 20px;
}

.image img{
  max-width: 100%;
}

一切正常,填充已添加,但我需要重新加载tableViewcell才能看到效果。

我已经覆盖了我的customCell的 viewWillLayoutSubviews()这样的功能,用于填充

class NRLabel : UILabel {

    var textInsets = UIEdgeInsets.zero {
        didSet { invalidateIntrinsicContentSize() }
    }

    override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
        let insetRect = UIEdgeInsetsInsetRect(bounds, textInsets)
        let textRect = super.textRect(forBounds: insetRect, limitedToNumberOfLines: numberOfLines)
        let invertedInsets = UIEdgeInsets(top: -textInsets.top,
                                          left: -textInsets.left,
                                          bottom: -textInsets.bottom,
                                          right: -textInsets.right)
        return UIEdgeInsetsInsetRect(textRect, invertedInsets)
    }

    override func drawText(in rect: CGRect) {
        super.drawText(in: UIEdgeInsetsInsetRect(rect, textInsets))
    }
}

效果是这样的。

enter image description here

你看,第一个标签在重新加载单元格后正在填充它。

请建议如何使用上述扩展程序来实现UILabel填充,以便解决此问题。

4 个答案:

答案 0 :(得分:0)

添加  这两个函数进入你的扩展并删除所有其他:

rest

答案 1 :(得分:0)

使用您的NRLabel课程,这对我来说很好。在Storyboard TableViewCell Prototype中添加了theLabel,并将约束设置为允许自动调整行大小。

class PaddedLabelCell : UITableViewCell {

    @IBOutlet weak var theLabel: NRLabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        self.setupLabel()
    }

    func setupLabel() -> Void {
        theLabel.layer.cornerRadius = 8.0
        theLabel.layer.masksToBounds = true
        theLabel.textInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
        // any other setup stuff can go here....
    }

}

答案 2 :(得分:0)

NRLabel中没有任何内容告诉它在textInsets属性更改时重绘。你需要做这样的事情:

var textInsets = UIEdgeInsets.zero {
    didSet { 
        invalidateIntrinsicContentSize() 
        setNeedsDisplay()
    }
}

现在,当textInsets属性发生变化时,将使用新的文本插图重新绘制NRLabel。

答案 3 :(得分:-1)

经过一段漫长的疲惫时光,我才找到了我从未尝试过的解决方案,我不知道为什么。 :(

cellForRowAtIndexPath 中,我刚刚编写了customCell文件中的行。

在返回单元格之前调用此行。

cell.chatLabel.textInsets = UIEdgeInsets.init(top: 10, left: 10, bottom: 10, right: 10)

背后的原因可能是,Cell被绘制了所有的功能,但它没有太多的刷新它的UI。 因此,在显示单元格之前调用该行可以解决问题。