iOS实时预览自定义视图

如图所示:


a.jpg

介绍:
从Xcode6开始就已经有此功能,通过IB_DESIGNABLE和IBInspectable属性实现自定义视图的实时渲染.随时修改随时查看效果,不用每次都run到模拟器或者真机上面才能看到效果.
该篇是在OC中使用,若在Swift中,对应的关键字则是@IB_DESIGNABLE和@IBInspectable,效果一样.

IB_DESIGNABLE可以写在.m文件里,也可以写在@interface前一行.
IBInspectable则是用来修饰属性,如果用它修饰的属性,则会以驼峰为空格分开单词的方式显示在xib或者storboard的属性检查器的顶部.它仅BOOL,NSNumber,NSString,NSRange,CGFloat, CGPoint, CGSize, CGRect, UIColor, UIImage这些属性.

borderWidth;borderColor;masksToBounds;cornerRadius;在开发过程中总是需要手动去写.layer.borderWidth = xx;是不是很麻烦?如果像设置背景颜色一样可以直接选择岂不是很省事?

实现:
创建一个UIView的扩展类就叫UIView+Utilities吧,有以下4个属性:

    @property (nonatomic, assign) IBInspectable CGFloat borderWidth;
    @property (nonatomic, strong) IBInspectable UIColor *borderColor;
    @property (nonatomic, assign) IBInspectable BOOL masksToBounds;
    @property (nonatomic, assign) IBInspectable CGFloat cornerRadius;

实现文件里面写上各个属性的getset方法,以及drawrect方法

- (CGFloat)borderWidth {
    return self.layer.borderWidth;
}

- (void)setBorderWidth:(CGFloat)borderWidth {
    self.layer.borderWidth = borderWidth;
}

- (UIColor *)borderColor {
    return [UIColor colorWithCGColor:self.layer.borderColor];
}

- (void)setBorderColor:(UIColor *)borderColor {
    self.layer.borderColor = borderColor.CGColor;
}

- (CGFloat)cornerRadius {
    return self.layer.cornerRadius;
}

- (void)setCornerRadius:(CGFloat)cornerRadius {
    self.layer.cornerRadius = cornerRadius;
}

- (BOOL)masksToBounds {
    return self.layer.masksToBounds;
}

- (void)setMasksToBounds:(BOOL)masksToBounds {
    self.layer.masksToBounds = masksToBounds;
}

- (void)drawRect:(CGRect)rect {
    self.layer.masksToBounds = self.masksToBounds;
    self.layer.borderColor = self.borderColor.CGColor;
    self.layer.cornerRadius = self.cornerRadius;
    self.layer.borderWidth = self.borderWidth;
}

这个时候就完了吗?可以说是完了,因为你会看到已经有了这几个属性可以直接设置了,但是视图就是没有被渲染.


b.jpeg

我们还得根据控件类型自定义一个类,让这个控件继承自它,比如我这里为UIButton定义一个自定义的类,头文件里啥都不需要做,仅在实现文件里加上IB_DESIGNABLE这个关键字就行了.

#import "TXUIButton.h"
IB_DESIGNABLE
@implementation TXUIButton
@end

然后,修改该button的class为TXUIButton


c.jpeg

同理可以把其他的View都像button一样写一个自定义类,这样在做界面的时候是不是会方便的多?你也可以再自定义一些特殊的属性以满足当前项目的需要,比如画图啥的

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 【Android 自定义View】 [TOC] 自定义View基础 接触到一个类,你不太了解他,如果贸然翻阅源码只...
    Rtia阅读 4,028评论 1 14
  • @echo offfecho hello @echo offfor /f "skip=3 tokens=4" %...
    YidanTan阅读 529评论 0 0
  • 人生匆匆数十载,在短暂的人生中,要活出自己,在苍茫的世间要留下自己的痕迹。于是,我明白了:活着的使命在于,倾听自己...
    D035牛牛_佛山阅读 270评论 0 6