本篇是对上一篇《如何在Xcode 6+中创建可设计的视图控件》的补充。摒弃了令人头疼的drawRect:
,通过-(void)layoutSubviews
和iOS8+之后引入的-(void)prepareForInterfaceBuilder
来完成InterfaceBuilder内的重绘和初始化工作。
首先,先说下-(void)prepareForInterfaceBuilder
,这是iOS8之后Simulator中对NSObject添加的一个方法,主要用来初始化当前类在InterfaceBuilder中内容。然后,为@IBInspectable变量赋值时,通过-(void)layoutSubviews
方法进行界面重绘和布局。
目标
本次依然是一个简单的控件CircleStepper,效果如下。
CircleStepper有5个@IBInspectable属性:bgColor
、fgColor
、fontSize
、stepCount
、currentStep
。分别对应弧形进度条底色、弧形进度条前景色、中间Label的字体大小、进度上限和当前进度。
结构
关于@IBDesignable
和@IBInspectable
的使用,详见前文,不在复述。
直接看本次Demo的结构。
首先在-(void)prepareForInterfaceBuilder
和-(void)awakeFromNib
方法中对界面元素完成初始;
然后在-(void)layoutSubviews
方法中,通过属性值对界面元素进行重绘和布局,OK。
实施
定义成员变量(属性)
1.新建CircleStepper类,定义5个@IBInspectable变量如下:
2.为了定义变量stepperLabel
、bgLayer
、fgLayer
分辨对应3个界面元素,这里几个私有变量。
初始化
定义初始化方法-(void)setup
,并且在prepareForInterfaceBuilder
和awakeFromNib
中分别调用(如果需要添加代码创建,那么重载initWithFrame:
方法,调用setup
)。在setup
方法中对两个弧形的进度条(CAShapeLayer)和中间Label进行初始和基础设置。代码如下:
界面刷新
重载- (void)layoutSubviews
方法,刷新界面元素并且添加动画。代码如下:
因bgLayer
和fgLayer
基本相同,都是简单的弧形,所以定义-(void)setupShapeLayer:
方法,对其进行界面刷新。代码如下:
利用基本的CABasicAnimation让数值变化看起来更生动一些。代码如下:
然后,就没有然后。
总结 & Demo下载
另外,回去查了下资料,Inspectable支持的类型包括:Int
, Double
, CGFloat
, String
, Bool
, CGPoint
, CGSize
, CGRect
, UIColor
, UIImage
。