IBInspectable和IB_DESIGNABLE的使用

        最近无意中知道了IBInspectable和IB_DESIGNABLE,感觉如果在项目中使用会给我们程序员带来意想不到的的方便.试想下:在做应用的UI设计的时候,如果属性能够在Interface Builder的图形化界面进行设置,并且动态的预览到效果,那样无疑会大大提高应用的开发效率。而XCode为我们提供了这样的一种方式,就是使用IBInspectable和IB_DESIGNABLE.(Xcode 6出现的这两个属性-->原理就是在xib里面设置完成之后帮我们添加一个runtime attributes,虽然我们也可以通过User Defined Rumtime Attributes可以在Interface Builder中,设置一些KVC属性的值,但是这样做不容易调试和后期维护).

IBInspectable

让支持KVC的属性能够在Attribute Inspector中配置。其修饰成员变量,其修饰的变量可以在xib右边的控制面板里面直接更改其值

例如我想实现一个自定义的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)可以直接进行设置,界面如下


IBInspectable和IB_DESIGNABLE的使用_第1张图片

每次设置这三个选项之后,都会在Identity Inspector中改变一个rumtime的KVC变量,不过现在仍然不能动态的刷新

通过IB_DESIGNABLE配合IBInspectable可以实现动态刷新

实现方式很简单,就是在自定义类的头文件处加上这个宏定义即可。然后把对应的类设置为自定义的类。IB_DESIGNABLE修饰View,这个View是自定义的,其修饰的View可以直接在xib里面动态渲染

但是切记不能修饰分类,比如上边提到的UIView的分类,如果把IB_DESIGNABLE加载此分类中是毫无作用的.可以自定义一个类,继承自UITextField,然后在此类中添加这个宏定义,然后不要忘了和xib中的UITextfield相关联,这个时候,你再设置上边的三个配置选项就会发现能够动态刷新了.

如果不能动态刷新,重启XCode,如果还不能刷新,如下图RefreshingAllViews,建议开启Automatically Refresh Views


IBInspectable和IB_DESIGNABLE的使用_第2张图片

你可能感兴趣的:(IBInspectable和IB_DESIGNABLE的使用)