在这里,我正在尝试在标签周围添加一些填充(左侧,右侧,顶部和底部)。
此问题与SOF相关,并且在阅读了其中的一些文章之后,我尝试使用建议的here解决方案:

这是我的子类UILabel的代码:

import UIKit

class LuxLabel: UILabel {
    //let padding: UIEdgeInsets
    var padding: UIEdgeInsets = UIEdgeInsets.zero {
        didSet {
            self.invalidateIntrinsicContentSize()
        }
    }

    // Create a new PaddingLabel instance programamtically with the desired insets
    required init(padding: UIEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)) {
        self.padding = padding
        super.init(frame: CGRect.zero)
    }

    // Create a new PaddingLabel instance programamtically with default insets
    override init(frame: CGRect) {
        padding = UIEdgeInsets.zero // set desired insets value according to your needs
        super.init(frame: frame)
    }

    // Create a new PaddingLabel instance from Storyboard with default insets
    required init?(coder aDecoder: NSCoder) {
        padding = UIEdgeInsets.zero // set desired insets value according to your needs
        super.init(coder: aDecoder)
    }

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

    // Override `intrinsicContentSize` property for Auto layout code
    override var intrinsicContentSize: CGSize {
        let superContentSize = super.intrinsicContentSize
        let width = superContentSize.width + padding.left + padding.right
        let heigth = superContentSize.height + padding.top + padding.bottom
        return CGSize(width: width, height: heigth)
    }
}

它基于PaddingLabel(请参阅上面的链接)。

它通常运行良好,但是由于某些我不理解的原因,在某些情况下会出现问题并且显示会被截断。

这是一个例子:

放在标签上的字符串是:

“它具有方形和蓝色。”

创建标签的代码是:
let label = LuxLabel(padding: UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10))
label.numberOfLines = 0

结果如下:

ios - UILabel上的文本填充-LMLPHP

如果我将此行添加到上面的两个中:

label.lineBreakMode = .byWordWrapping

结果是:

ios - UILabel上的文本填充-LMLPHP

我还设置了一些约束。所有这些在95%的时间内都有效。谁能看到问题所在?

最佳答案

尝试调用invalidateIntrinsicContentSize:

var padding: UIEdgeInsets = UIEdgeInsets.zero {
    didSet {
        self.invalidateIntrinsicContentSize()
    }
}

编辑:

我尝试了不同的选择。如果您用frame size中的intrinsicContentSize更新layoutSubviews可以达到目的,但我不知道是否有更好的方法:
override func layoutSubviews() {
    super.layoutSubviews()
    self.frame.size = self.intrinsicContentSize
}

关于ios - UILabel上的文本填充,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47234008/

10-13 08:45