UILabel在設置背景顏色的時候,四條邊是緊貼著文字的,我們想寫一個小tag樣式的控件(如下圖所示)
tag樣式示例
一般有以下兩種實現方式:
- 計算文字寬度和高度,加top、right、bottom、left的間隔,再給label賦值計算后的size
- (一般用于xib/storyboard)文字label+背景view,label為view的子控件,給label設置距離view的內部約束,靠自動布局把view撐開
如果UILabel有Inset屬性就會節省一定的開發成本。自定義一個UILabel實現這個功能吧~
class XYInsetLabel: UILabel {
/// 可以設置文字上下左右的邊距
var textInsets: UIEdgeInsets = UIEdgeInsets.zero {
didSet {
setNeedsLayout()
}
}
/// 便利構造方法
convenience init(textInsets: UIEdgeInsets = .zero) {
self.init(frame: CGRect.zero)
self.textInsets = textInsets
}
override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
guard !(text?.isEmpty ?? true) else { return super.textRect(forBounds: bounds, limitedToNumberOfLines: numberOfLines) }
let addInset = bounds.inset(by: textInsets)
let realRect = super.textRect(forBounds: addInset, limitedToNumberOfLines: numberOfLines)
let invertedInsets = UIEdgeInsets(top: -textInsets.top, left: -textInsets.left, bottom: -textInsets.bottom, right: -textInsets.right)
return realRect.inset(by: invertedInsets)
}
override func drawText(in rect: CGRect) {
super.drawText(in: rect.inset(by: textInsets))
}
}
使用示例:
// 設置文字上下邊距4,左右邊距8
let tagLabel = XYInsetLabel.init(textInsets: UIEdgeInsets(top: 4, left: 8, bottom: 4, right: 8))
// 按照普通label設置其他屬性即可
tagLabel.text = "一個tag"
tagLabel.sizeToFit()
tagLabel.layer.masksToBounds = true
tagLabel.layer.cornerRadius = 4
tagLabel.textColor = .red
tagLabel.backgroundColor = UIColor(red: 1, green: 0, blue: 0, alpha: 0.2)
// 不用關心它的寬高,直接設置center就行,label會根據文字和邊距自動計算寬高
tagLabel.center = CGPoint(x: 200, y: 200)
view.addSubview(tagLabel)
運行效果