iOS开发IT技巧干货iOS程序猿

iOS tutorial 8:使用IBInspectable 和

2017-08-14  本文已影响575人  Andy_Ron

参考:appcode网站的书《Intermediate iOS Programming with Swift》 的Chapter 36

例子代码:https://github.com/andyRon/LearniOSByProject/tree/master/77

理解IBInspectable 和 IBDesignable

简单地说,IBInspectable 就是允许开发者在IB的属性检查器中添加额外的选项。IBDesignable 能够让* IBInspectable* 添加的额外选项产生的变化在IB中实时显示。以Button的圆角为例说明。

button.layer.cornerRadius = 10.0
button.layer.masksToBounds = true

或者直接在IB的Identity检查器user defined runtime attributes中添加:

注意到,这种修改不是实时,在IB中Button还是直角,只有运行后才是圆角。

class RoundedCornerButton: UIButton {
    @IBInspectable var cornerRadius: CGFloat = 0.0 {
        didSet {
            layer.cornerRadius = cornerRadius
            layer.masksToBounds = cornerRadius > 0
        }
    }
}

然后把button的class属性修改成RoundedCornerButton:

发现这个button的属性检查器中多了Corner Radius

注意: cornerRadius属性变成了Corner RadiusRoundedCornerButton类变成了 Rounded Corner Button,这是Xcode自动转变的,开发者只需要依照swift的命名规范就可以了(类名是大写开头的驼峰命名规则,属性名是小写开头的驼峰命名规则)

cornerRadius的类型是CGFloat,在属性检查器中就对应数字的选择。当然不是所有类型都可以添加属性检查器中的,IBInspectable支持如下类型:

Int
CGFloat 
Double 
String 
Bool 
CGPoint 
CGSize 
CGRect 
UIColor 
UIImage

如果在类RoundedCornerButton前添加@IBDesignable,那在属性检查器中自定义的属性变化就可以在IB中实时显示了。

@IBDesignable class RoundedCornerButton: UIButton {
    @IBInspectable var cornerRadius: CGFloat = 0.0 {
        didSet {
            layer.cornerRadius = cornerRadius
            layer.masksToBounds = cornerRadius > 0
        }
    }
}

创建Fancy Button

创建Fancy Button来更加深入的了解IBInspectable 和 IBDesignable

FancyButton中添加如下代码:

  @IBInspectable var enableImageRightAligned: Bool = false
  
  override func layoutSubviews() {
      super.layoutSubviews()
      
      if enableImageRightAligned, let imageView = imageView {
          imageEdgeInsets.left = self.bounds.width - imageView.bounds.width - imageRightPadding
      }
  }
+ `enableImageRightAligned`属性又来自动计算 `imageEdgeInsets.left`

渐变色需要运行后才能看到

上一篇 下一篇

猜你喜欢

热点阅读