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)
}
}