在这里,我试图在文本周围添加一些标签(左,右,顶部和底部)。 这个问题有关于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
这就是结果:
如果我将这一行添加到上面两个:
label.lineBreakMode = .byWordWrapping
结果是:
我也设置了一些约束。所有这一切在95%的时间都有效。任何人都可以看到问题是什么?
答案 0 :(得分:1)
尝试调用invalidateIntrinsicContentSize:
var padding: UIEdgeInsets = UIEdgeInsets.zero {
didSet {
self.invalidateIntrinsicContentSize()
}
}
修改强>
我尝试了不同的选择。如果您使用frame size
中的intrinsicContentSize
更新layoutSubviews
,但我不知道是否有更好的方法:
override func layoutSubviews() {
super.layoutSubviews()
self.frame.size = self.intrinsicContentSize
}