2016-08-22 113 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现场渲染它虽然。

相关问题