如何动态计算线间距的nsattributed字符串的高度

时间:2016-04-15 14:26:47

标签: ios swift nsattributedstring

我试图用LineSpacing属性计算UILabel的高度。奇怪的是,普通label.text的高度的计算值低于label.attributedText及其lineheight。看起来我做错了什么,但找不到什么,所以请帮忙:D。

提供的代码专为SO而设计,使其紧凑和清晰,在我的项目中以不同的方式实现。

let contentHeight = contentLabel.text! == "" ? 0 : contentLabel.getHeightWidthGivenWidthAndLineHeight(3, labelWidth: labelWidth)

我打电话给

{{1}}

使用普通字符串(没有间距)可以很好地工作,当我使用带有lineSpacing的attributesstring时,如果失败则计算正确的值。

2 个答案:

答案 0 :(得分:4)

你可以使用UILabel的sizeThatFits。例如:

    let text = "This is\nSome\nGreat\nText"

    let contentHeight = contentLabel.text! == "" ? 0 : contentLabel.getHeightWidthGivenWidthAndLineHeight(6, labelWidth: labelWidth) 
    //returns 73.2

但只需设置

    contentLabel.attributedText = contentLabel.attributedString //attributedString is same as getHeightWidthGivenWidthAndLineHeight

    let size = contentLabel.sizeThatFits(contentLabel.frame.size) 
    //returns (w 49.5,h 99.5)

如果您需要查看:

,则会将contribString的代码添加到您的扩展程序中
var attributedString:NSAttributedString?{
        if let text = self.text{
            let attributeString = NSMutableAttributedString(string: text)
            let style = NSMutableParagraphStyle()

            style.lineSpacing = 6
            attributeString.addAttribute(NSParagraphStyleAttributeName, value: style, range: NSMakeRange(0, text.characters.count))
            return attributeString
        }
        return nil
    }

答案 1 :(得分:0)

我以这种方式更新了我的扩展,以设置行高并同时返回新的标签高度。 Thanx to beyowulf

extension UILabel {

    func setLineHeight(lineHeight: CGFloat, labelWidth: CGFloat) -> CGFloat {
        let text = self.text
        if let text = text {
            let attributeString = NSMutableAttributedString(string: text)
            let style = NSMutableParagraphStyle()

            style.lineSpacing = lineHeight
            attributeString.addAttribute(NSParagraphStyleAttributeName, value: style, range: NSMakeRange(0, text.characters.count))
            self.attributedText = attributeString
            return self.sizeThatFits(CGSize(width: labelWidth, height: 20)).height
        }
        return 0
    }
}