UILabel上的文本填充

在这里,我正在尝试在文本周围添加一些填充(左,右,上,下)的标签。 这个问题在SOF上有相关的post,在阅读了其中的一些之后,我试着使用这里提出的一个解决scheme:

这是我的子类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(参见上面的链接)。

它主要运行良好,但由于某些原因,我不明白,有些情况下出现问题,显示被截断。

这是一个例子:

放在标签上的string是:

“它有一个正方形和一个蓝色。”

创build标签的代码是:

 let label = LuxLabel(padding: UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)) label.numberOfLines = 0 

这是结果:

在这里输入图像说明

如果我把这一行添加到上面的两个:

label.lineBreakMode = .byWordWrapping

结果是:

在这里输入图像说明

我也设置了一些限制。 所有这些工作的95%的时间。 任何人都可以看到有什么问题?

尝试调用invalidateIntrinsicContentSize:

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

编辑:

我尝试了不同的select。 如果使用layoutSubviews中的intrinsicContentSize更新了frame size ,但是我不知道是否有更好的方法来实现:

 override func layoutSubviews() { super.layoutSubviews() self.frame.size = self.intrinsicContentSize }