废话不多,先上github地址,不想看啰嗦的话,直接把项目中
UIView+CornerRadius
分类导入到自己项目中即可,不需要其他任何操作.
使用xib+storyboard开发能够极大的提高开发效率发展到现在这点应该没有什么异议了,如果还有禁止使用这些东西的公司我觉的可以考虑辞职了......
但是有一些属性再系统默认的设置面板里面我们并不能找到,最常用的就是layer.borderWidth,layer.cornerRadius,layer.borderColor
这三个属性了,之前都是手动在runtime属性里面手动添加,比如:
但是每次用都要加上去未免太过麻烦,于是就在想能不能有个好的方式代替这种繁琐的操作,后来发现现在oc有了新的关键字就是来做这个事情的:
IBInspectable
基础版
在给你用的那个xib添加对应属性,加上IBInspectable
关键字,比如:
@property (nonatomic, assign)IBInspectable CGFloat cornerRadius;
这样我们就能在面板里面直接控制圆角大小了,与此同时我们还可以加上IB_DESIGNABLE
关键字,来让xib可以可视化的设置属性,所见即所得.
似乎达到了要求,但是开头那个痛点还在:每个xib都要去设置.
于是乎我又想到了通过给UIView
添加一个分类来做这件事情,就有了下面的过程:
进阶版
新建一个UIView+CornerRadius
的分类,在分类的头文件中添加平时用到的一些属性,别忘了IBInspectable
关键字
@property (nonatomic, assign)IBInspectable CGFloat cornerRadius;
@property (nonatomic, assign)IBInspectable CGFloat borderWidth;
@property (nonatomic, strong)IBInspectable UIColor *borderColor;
由于OC的特性,分类是无法扩展属性的,所以这里我们需要手动实现其set方法与get方法:
- (CGFloat)cornerRadius
{
return [objc_getAssociatedObject(self, @selector(cornerRadius)) floatValue];
}
- (void)setCornerRadius:(CGFloat)cornerRadius
{
self.layer.cornerRadius = cornerRadius;
self.layer.masksToBounds = YES;
}
- (CGFloat)borderWidth
{
return [objc_getAssociatedObject(self, @selector(borderWidth)) floatValue];
}
- (void)setBorderWidth:(CGFloat)borderWidth
{
self.layer.borderWidth = borderWidth;
self.layer.masksToBounds = YES;
}
- (UIColor *)borderColor
{
return objc_getAssociatedObject(self, @selector(borderColor));
}
- (void)setBorderColor:(UIColor *)borderColor
{
self.layer.borderColor = borderColor.CGColor;
}
大功告成,到这里为止,我们在xib中使用UIView
的子类的时候,都可以很方便的设置borderColor , borderWidth, cornerRadius
了,如果有兴趣,还可以扩展更多的属性.
如图:
美中不足
使用了分类的话,是无法通过IB_DESIGNABLE
进行实时修改实时显示的,所以只有在运行后能看到实际效果,个人猜测是使用了分类之后并不能给原类扩展属性,仅仅是添加了相应的set与get方法导致的,如果有人知道能够解决这个问题,求告知啊~~~