1.@IBInspectable

@IBInspectable(或是 Objective-C 中的 IBInspectable) 提供了访问旧有功能的新方式。
比如在以前我们为一个UIView切圆角时,可以在面板里设置它的运行时属性,以键值对的形式。如下图所示:
@IBInspectable 与 @IBDesignable - 图1

使用起来有点繁琐,而且没有拼写检查,一旦有个字母拼写错误,就会在运行时造成崩溃。所以很少使用。

现在有了@IBInspectable 就大为不同了。比如,我们可以在一个UIView的子类里,创建上面的三个属性,并用@IBInspectable 修饰。

  1. @IBInspectable var cornerRadius: CGFloat = 0 {
  2. didSet {
  3. layer.cornerRadius = cornerRadius
  4. layer.masksToBounds = cornerRadius > 0
  5. }
  6. }
  7. @IBInspectable var borderWidth: CGFloat = 0 {
  8. didSet {
  9. layer.borderWidth = borderWidth
  10. }
  11. }
  12. @IBInspectable var borderColor: UIColor? {
  13. didSet {
  14. layer.borderColor = borderColor?.CGColor
  15. }
  16. }

一旦这样做了,我们就能在Interface Builder 的观察面板(inspector panel)里看到这些属性,并编辑它们了。
@IBInspectable 与 @IBDesignable - 图2

支持修饰的属性类型有: 布尔、字符串、数字、以及 CGPoint、CGSize、CGRect、UIColor 和 NSRange,额外增加了 UIImage。

还可以为UIView添加一个扩展,来使属性在面板可见,以后可以直接这是圆角了,是不是很赞!

  1. extension UIView {
  2. @IBInspectable var cornerRadius: CGFloat {
  3. get {
  4. return layer.cornerRadius
  5. }
  6. set {
  7. layer.cornerRadius = newValue
  8. layer.masksToBounds = newValue > 0
  9. }
  10. }
  11. }

2.@IBDesignable

只需在类名前加上 @IBDesignable 的前缀(或是 Objective-C 里的 IB_DESIGNABLE 宏)。你在面板上设置的自定义的属性,就可以在画布上被实时渲染出来了。

  1. @IBDesignable
  2. class MyCustomView: UIView {
  3. ...
  4. }

@IBInspectable 与 @IBDesignable - 图3

注意:如果用@IBDesignable修饰分类,是不会实时渲染的,这个比较可惜。