2016-08-22 114 views
0

這是怎麼看我的子類UILabel如何使用@IBDesignable屬性爲UILabel設置填充?

@IBDesignable class AttributedLabel: UILabel { 

    @IBInspectable var padding: CGFloat = 0 

    override func drawTextInRect(rect: CGRect) { 
     super.drawTextInRect(UIEdgeInsetsInsetRect(rect, UIEdgeInsetsMake(padding, padding, padding, padding))) 
    } 
} 

我正確地設置在故事板padding但它不工作,因爲填充仍然0

怎麼做才能使它工作?是否有可能使它在Storyboard中生存?

回答

0

像這樣使用;更改頂部,底部,左側,右側嵌入填充。

@IBDesignable class AttributedLabel: UILabel { 

    @IBInspectable var topInset: CGFloat = 5.0 
    @IBInspectable var bottomInset: CGFloat = 5.0 
    @IBInspectable var leftInset: CGFloat = 7.0 
    @IBInspectable var rightInset: CGFloat = 7.0 

    override func drawTextInRect(rect: CGRect) { 
     let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset) 
     super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets)) 
    } 

    override func intrinsicContentSize() -> CGSize { 
     var intrinsicSuperViewContentSize = super.intrinsicContentSize() 
     intrinsicSuperViewContentSize.height += topInset + bottomInset 
     intrinsicSuperViewContentSize.width += leftInset + rightInset 
     return intrinsicSuperViewContentSize 
    } 
} 

感謝

1

你的子類看起來不完整的。如文檔中提到的,你應該重寫這兩種方法:

public func textRectForBounds(bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect 
public func drawTextInRect(rect: CGRect) 

下面是一個示例實現,應該工作:

@IBDesignable class AttributedLabel : UILabel 
{ 
    @IBInspectable var padding: CGFloat = 0 { 
     didSet { 
      self.textInsets = UIEdgeInsets(top: self.padding, left: self.padding, bottom: self.padding, right: self.padding) 
     } 
    } 
    var textInsets = UIEdgeInsetsZero { 
     didSet { 
      self.invalidateIntrinsicContentSize() 
     } 
    } 

    override func textRectForBounds(bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect 
    { 
     var insets = self.textInsets 
     let insetRect = UIEdgeInsetsInsetRect(bounds, insets) 
     let textRect = super.textRectForBounds(insetRect, limitedToNumberOfLines: numberOfLines) 
     insets = UIEdgeInsets(top: -insets.top, left: -insets.left, bottom: -insets.bottom, right: -insets.right) 
     return UIEdgeInsetsInsetRect(textRect, insets) 
    } 

    override func drawTextInRect(rect: CGRect) { 
     super.drawTextInRect(UIEdgeInsetsInsetRect(rect, self.textInsets)) 
    } 
} 

您將無法在Interface Builder現場渲染它雖然。

相關問題