? ? ? ? 最近無意中知道了IBInspectable和IB_DESIGNABLE,感覺如果在項目中使用會給我們程序員帶來意想不到的的方便.試想下:在做應用的UI設計的時候,如果屬性能夠在Interface Builder的圖形化界面進行設置,并且動態(tài)的預覽到效果,那樣無疑會大大提高應用的開發(fā)效率。而XCode為我們提供了這樣的一種方式,就是使用IBInspectable和IB_DESIGNABLE.(Xcode 6出現(xiàn)的這兩個屬性-->原理就是在xib里面設置完成之后幫我們添加一個runtime attributes,雖然我們也可以通過User Defined Rumtime Attributes可以在Interface Builder中,設置一些KVC屬性的值,但是這樣做不容易調(diào)試和后期維護).
IBInspectable
讓支持KVC的屬性能夠在Attribute Inspector中配置。其修飾成員變量,其修飾的變量可以在xib右邊的控制面板里面直接更改其值
例如我想實現(xiàn)一個自定義的UItextField,通過xib設置它的一些屬性(圓角,邊線寬度,邊線顏色等),此時可以寫一個UIView的分類,在.h文件中聲明這三個屬性并用IBInspectable修飾.
@interface UIView (Inspectable)
/**
*? 可以在xib里面直接設置的:圓角
*/
@property (nonatomic, assign) IBInspectable CGFloat cornerRadius;
/**
*? 可以在xib里面直接設置的:邊線寬度
*/
@property (nonatomic, assign) IBInspectable CGFloat borderWidth;
/**
*? 可以在xib里面直接設置的:邊線顏色
*/
@property (nonatomic, assign) IBInspectable UIColor *borderColor;
在.m文件中
@implementation UIView (Inspectable)
- (void)setCornerRadius:(CGFloat)cornerRadius{
self.layer.cornerRadius = cornerRadius;
self.layer.masksToBounds = cornerRadius>0;
}
- (CGFloat)cornerRadius{
return self.layer.cornerRadius;
}
- (void)setBorderColor:(UIColor *)borderColor{
self.layer.borderColor = borderColor.CGColor;
}
- (UIColor *)borderColor{
return [UIColor colorWithCGColor:self.layer.borderColor];
}
- (void)setBorderWidth:(CGFloat)borderWidth{
self.layer.borderWidth = borderWidth;
}
- (CGFloat)borderWidth{
return self.layer.borderWidth;
}
@end
此時在storyboard中的Attribute Inspector就會多出三個配置選項(cornerRadius,borderColor,borderWidth)可以直接進行設置,界面如下

每次設置這三個選項之后,都會在Identity Inspector中改變一個rumtime的KVC變量,不過現(xiàn)在仍然不能動態(tài)的刷新
通過IB_DESIGNABLE配合IBInspectable可以實現(xiàn)動態(tài)刷新
實現(xiàn)方式很簡單,就是在自定義類的頭文件處加上這個宏定義即可。然后把對應的類設置為自定義的類。IB_DESIGNABLE修飾View,這個View是自定義的,其修飾的View可以直接在xib里面動態(tài)渲染
但是切記不能修飾分類,比如上邊提到的UIView的分類,如果把IB_DESIGNABLE加載此分類中是毫無作用的.可以自定義一個類,繼承自UITextField,然后在此類中添加這個宏定義,然后不要忘了和xib中的UITextfield相關聯(lián),這個時候,你再設置上邊的三個配置選項就會發(fā)現(xiàn)能夠動態(tài)刷新了.
如果不能動態(tài)刷新,重啟XCode,如果還不能刷新,如下圖RefreshingAllViews,建議開啟Automatically Refresh Views
