美文网首页#iOS#HeminWoniOS资料库iOS UI
iOS Label多行的高度计算技巧

iOS Label多行的高度计算技巧

作者: Derek重名了 | 来源:发表于2016-10-26 00:19 被阅读1844次

    在iOS开发中,有时候需要计算多行的Label的高度,下面2种方法可以获得高度。
    请注意,在使用前需要把UILabel.numberOfLines设置为0,以便能够多行显示文字。

    方法一

    使用UILabel重载的sizeToFit方法

    // SWIFT
    func sizeThatFits(_ size: CGSize) -> CGSize
    
    // OBJECTIVE-C
    - (CGSize)sizeThatFits:(CGSize)size
    

    sizeThatFit接收一个CGSize作为初始的UILabel尺寸,然后根据UILabel.text占用的空间计算最接近给定的size的尺寸。

    代码可以这样写:

    let label = UILabel.init()
    label.numberOfLines = 0
    label.font = UIFont.systemFont(ofSize: 14)
    label.text = "This is a very long text, very long text, long text, text, ..............................."
    
    let size = label.sizeThatFits(CGSize(width: 100, height: 0))    // 计算出最合适的size
    
    // 输出结果是:{w 96.5 h 100.5}
    

    方法二

    使用sizeWithAttributes方法

    // SWIFT
    func size(attributes attrs: [String : Any]? = nil) -> CGSize
    // func sizeWithAttributes(_ attrs: [String : AnyObject]?) -> CGSize  这个应该是老版本swift的方法
    
    // OBJECTIVE-C
    - (CGSize)sizeWithAttributes:(NSDictionary<NSString *,id> * _Nullable)attrs
    

    比如需要计算2行的UILabel的高度,如何构造2行的字符串呢?这里我们需要使用一种非常trick的方法,如下声明:

    let twolineStr = "*\n*"      // 这个字符串会占用2行的空间
    

    那么,计算高度的代码可以是这样的:

    let twolineStr = "*\n*"
    let attribute = [ NSFontAttributeName: UIFont.systemFont(ofSize: 14) ]
    let tSize = twolineStr.size(attributes: attribute)     // here may be line2Str.sizeWithAttributes(...)
    // ceil size: 避免产生奇怪的小数
    let line2StrSize = CGSize(width: CGFloat(ceilf(Float(tSize.width))), height: CGFloat(ceilf(Float(tSize.height))))
    
    // 输出结果是:{w 7 h 34}
    

    能够计算2行的高度了,那可以推广到计算n行的高度,可以这么写:

    func heightOfLines(line: Int, font: UIFont) -> CGFloat {
        if line <= 0 {
            return 0
        }
        
        var mutStr = "*"
        for _ in 1...line-1 {
            mutStr = mutStr + "\n*"
        }
        
        let attribute = [ NSFontAttributeName: font ]
        let tSize = mutStr.size(attributes: attribute)     // here may be line2Str.sizeWithAttributes(...)
        
        // ceil size: 避免产生奇怪的小数
        let height = CGFloat(ceilf(Float(tSize.height)))
        
        return height
    }
    
    print(heightOfLines(line: 2, font: UIFont.systemFont(ofSize: 14)))
    
    // 输出结果为 "34.0\n"
    

    非常完美。


    总结

    • 当对UILabel的尺寸有一定限制时,比如宽度有限制,则计算高度时使用方法一;
    • 如果是需要计算多行(比如2行)UILabel占用的空间高度时,则可以使用方法二。

    相关文章

      网友评论

      本文标题:iOS Label多行的高度计算技巧

      本文链接:https://www.haomeiwen.com/subject/kykduttx.html