iOS 為UILabel添加edgeInset功能

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)
運行效果
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容