项目中常用到label的实际高度,有时也会需要知道label的实际行数是多少,系统的numberOfLines属性,只是设置label的最多显示的行数,而不是实际的行数。
我们写一个label的扩展,把需要的值作为属性计算出来,我们知道,在swift中,是可以使用计算属性的。
//
// UILabel+Ext.swift
//
// Created by weiman on 2019/1/2.
// Copyright © 2019 weiman. All rights reserved.
//
import Foundation
extension UILabel {
/// UILabel根据文字的需要的高度
public var requiredHeight: CGFloat {
let label = UILabel(frame: CGRect(
x: 0,
y: 0,
width: frame.width,
height: CGFloat.greatestFiniteMagnitude)
)
label.numberOfLines = 0
label.lineBreakMode = .byWordWrapping
label.font = font
label.text = text
label.attributedText = attributedText
label.sizeToFit()
return label.frame.height
}
/// UILabel根据文字实际的行数
public var lines: Int {
return Int(requiredHeight / font.lineHeight)
}
}
使用:
nameLabel.numberOfLines = nameLabel.lines > 1 ? 2 : 1
注意:
如果你是使用autolayout进行布局的,在使用这个属性的时候,一定要保证label的frame是正确的,尤其是宽度,一定要是准确的。如果不准确,请使用layoutIfNeeded(),确定一下frame,在使用计算属性。
网友评论