我有一个带有属性文本的UILabel,其中包含特定的lineSpacing或lineHeightMultiple。
let titleParagraphStyle = NSMutableParagraphStyle()
//titleParagraphStyle.lineSpacing = lineSpacing
titleParagraphStyle.lineHeightMultiple = 1.5
titleParagraphStyle.alignment = .left
let titleAttributes = [NSForegroundColorAttributeName: color,
NSFontAttributeName: UIFont(name: fontName, size: fontSize)!,
NSParagraphStyleAttributeName : titleParagraphStyle] as [String : Any]
let titleAttrString = NSAttributedString(string:string, attributes: titleAttributes)
var label = BetterUILabel()
label.numberOfLines = 0
label.attributedText = titleAttrString
label.setNeedsLayout() //I'm trying everything
label.layoutIfNeeded()
label.sizeToFit()
BetterUILabel是UILabel的子类,修复了perferredMaxLayoutWidth
class BetterUILabel: UILabel {
override public func layoutSubviews(){
super.layoutSubviews()
self.preferredMaxLayoutWidth = self.bounds.width
super.layoutSubviews()
}
override public var bounds: CGRect
{
didSet
{
self.preferredMaxLayoutWidth = self.bounds.width
}
}
override public var frame: CGRect
{
didSet
{
self.preferredMaxLayoutWidth = self.frame.width
}
}
}
label
是uiView的子视图,是UIStackView
内垂直UIScrollView
的排列视图。
标签固定在其超视图的顶部,左侧和右侧。它依靠它的内在内容大小来驱动它的高度。如果我从样式中移除任何lineSpacing
或lineHeightMultiple
或使用常规的非属性文本,则会很好地调整大小。但是,有了这些属性,它有时会切断6+和7+设备的最后一行。
我夸大了行间距以显示问题。
在6+上,绿色背景,UILabel顶部似乎有垂直空间,导致文本被截断:
是什么导致这种情况。这个问题有解决方法吗?