iOS swift5 实现UILabel的文字竖直方向上,中,下排放

825 阅读1分钟

iOS app 经常遇到需求中有要求UILabel 的文字位于一个view的顶部或底部。这个时候计算文字需要的高度有些麻烦。可以通过子类来实现该功能。

import UIKit

class VerticalLabel: UILabel {

    enum StrVerticalAlign {
        case Top
        case Center
        case Bottom
    }

    var verticalAlign: StrVerticalAlign = .Center {
        didSet {
            if oldValue != verticalAlign {
                self.setNeedsDisplay()
            }
        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
        var textRect: CGRect = super.textRect(forBounds: bounds, limitedToNumberOfLines: numberOfLines)
        switch self.verticalAlign {
        case .Top:
            textRect.origin.y = bounds.origin.y;
        case .Bottom:
            textRect.origin.y = bounds.origin.y+bounds.size.height-textRect.size.height;
        default: //Center
            textRect.origin.y = bounds.origin.y+(bounds.size.height-textRect.size.height)/2.0;
        }
        return textRect;
    }

    override func drawText(in rect: CGRect) {
        let actualRect: CGRect = self.textRect(forBounds: rect, limitedToNumberOfLines: self.numberOfLines)
        super.drawText(in: actualRect)
    }

}