iOS UIKit框架默认只能通过UILable的textAlignment属性调整其水平方向上的布局,设置文字水平居左、居中和居右。不能对文字垂直方向上的布局做出直接调整,但是我们通过重写UILabel的textRectForBounds和drawTextInRect方法,能够很便捷的调整UILable的内容布局,实现居上、垂直居中和居下的效果。具体实现如下:
创建VerticalAlignment枚举
| 12
 3
 4
 5
 
 | enum VerticalAlignment {case Top
 case Middle
 case Bottom
 }
 
 | 
重写UILabel
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 
 | class HLable: UILabel {
 override init(frame: CGRect) {
 self.verticalAlignment = .Middle
 super.init(frame: frame)
 }
 
 required init?(coder aDecoder: NSCoder) {
 self.verticalAlignment = .Middle
 super.init(coder: aDecoder)
 }
 
 var verticalAlignment: VerticalAlignment {
 didSet {
 self.setNeedsDisplay()
 }
 }
 
 override func textRectForBounds(bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
 var textRect = super.textRectForBounds(bounds, limitedToNumberOfLines: numberOfLines)
 switch self.verticalAlignment {
 case .Top:
 textRect.origin.y = bounds.origin.y
 case .Bottom:
 textRect.origin.y = bounds.origin.y + bounds.size.height - textRect.size.height
 case .Middle:
 textRect.origin.y = bounds.origin.y + (bounds.size.height - textRect.size.height) / 2.0
 }
 return textRect
 }
 
 override func drawTextInRect(rect: CGRect) {
 let actualRect = self.textRectForBounds(rect, limitedToNumberOfLines: numberOfLines)
 super.drawTextInRect(actualRect)
 }
 }
 
 | 
使用方法
| 12
 
 | let label = HLabel()label.verticalAlignment = .Top
 
 |