? ? ? ? 最近無意中知道了IBInspectable和IB_DESIGNABLE,感覺如果在項(xiàng)目中使用會(huì)給我們程序員帶來意想不到的的方便.試想下:在做應(yīng)用的UI設(shè)計(jì)的時(shí)候蝙泼,如果屬性能夠在Interface Builder的圖形化界面進(jìn)行設(shè)置,并且動(dòng)態(tài)的預(yù)覽到效果,那樣無疑會(huì)大大提高應(yīng)用的開發(fā)效率叮喳。而XCode為我們提供了這樣的一種方式,就是使用IBInspectable和IB_DESIGNABLE.(Xcode 6出現(xiàn)的這兩個(gè)屬性-->原理就是在xib里面設(shè)置完成之后幫我們添加一個(gè)runtime attributes,雖然我們也可以通過User Defined Rumtime Attributes可以在Interface Builder中淳附,設(shè)置一些KVC屬性的值,但是這樣做不容易調(diào)試和后期維護(hù)).
IBInspectable
讓支持KVC的屬性能夠在Attribute Inspector中配置帮辟。其修飾成員變量,其修飾的變量可以在xib右邊的控制面板里面直接更改其值
例如我想實(shí)現(xiàn)一個(gè)自定義的UItextField,通過xib設(shè)置它的一些屬性(圓角,邊線寬度,邊線顏色等),此時(shí)可以寫一個(gè)UIView的分類,在.h文件中聲明這三個(gè)屬性并用IBInspectable修飾.
@interface UIView (Inspectable)
/**
*? 可以在xib里面直接設(shè)置的:圓角
*/
@property (nonatomic, assign) IBInspectable CGFloat cornerRadius;
/**
*? 可以在xib里面直接設(shè)置的:邊線寬度
*/
@property (nonatomic, assign) IBInspectable CGFloat borderWidth;
/**
*? 可以在xib里面直接設(shè)置的:邊線顏色
*/
@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
此時(shí)在storyboard中的Attribute Inspector就會(huì)多出三個(gè)配置選項(xiàng)(cornerRadius,borderColor,borderWidth)可以直接進(jìn)行設(shè)置,界面如下
每次設(shè)置這三個(gè)選項(xiàng)之后,都會(huì)在Identity Inspector中改變一個(gè)rumtime的KVC變量,不過現(xiàn)在仍然不能動(dòng)態(tài)的刷新
通過IB_DESIGNABLE配合IBInspectable可以實(shí)現(xiàn)動(dòng)態(tài)刷新
實(shí)現(xiàn)方式很簡單龄糊,就是在自定義類的頭文件處加上這個(gè)宏定義即可逆粹。然后把對應(yīng)的類設(shè)置為自定義的類。IB_DESIGNABLE修飾View,這個(gè)View是自定義的,其修飾的View可以直接在xib里面動(dòng)態(tài)渲染
但是切記不能修飾分類,比如上邊提到的UIView的分類,如果把IB_DESIGNABLE加載此分類中是毫無作用的.可以自定義一個(gè)類,繼承自UITextField,然后在此類中添加這個(gè)宏定義,然后不要忘了和xib中的UITextfield相關(guān)聯(lián),這個(gè)時(shí)候,你再設(shè)置上邊的三個(gè)配置選項(xiàng)就會(huì)發(fā)現(xiàn)能夠動(dòng)態(tài)刷新了.
如果不能動(dòng)態(tài)刷新炫惩,重啟XCode僻弹,如果還不能刷新,如下圖RefreshingAllViews他嚷,建議開啟Automatically Refresh Views