根据我浅薄的ios开发经验,可以有以下方法添加custom uiview 的内容
1)draw
2)build in xib
3)add subviews
在custom uiview 的m文件中,一般按照以下对uiview进行初始设置:
1 -(void)awakeFromNib{ 2 [self setup]; 3 } 4 -(void)setup{ 5 //set up view 6 } 7 -(instancetype)initWithFrame:(CGRect)frame{ 8 self=[super initWithFrame:frame]; 9 if (self) { 10 [self setup]; 11 } 12 return self; 13 }
setup 中一般要做的事情有:
- setBackgroundColor:
- setContentMode:
- setOpaque: (尽量设置为 yes)
- setTranslatesAutoresizingMaskIntoConstraints: (如果使用autolayout,设置为no,否则可能constraint可能会冲突)
以下说明这三种方式的基本做法
一、draw
重写uiview 的
-(void)drawRect:(CGRect)rect{}
方法,在该方法中画uiview 的内容。
-可以用UIBezierPath画;
- 可以用CGContext 各种画图函数;
- 可以用uikit中各种控件自带的draw方法画
(如UIImage 的drawInRect:, NSAttributedString的drawInRect:)
- 当设置custom view 内容,位置相关的properties时,调用[self setNeedDisplay],系统会适时绘制
问题:drawRect:方法中能否使用 addSubview 方法?
我的理解:最好不要使用,因为可能每次draw都要add subview,
问题:如何添加UIButton ?
我的理解:在setup中用addsubview 的方式添加button(不要设置frame,此时view的geometry未确定),用NSLayoutContraint 约束button 的位置,或者在drawInRect:中设置button的frame
问题:如何接受用户的touch/ gesture
我的理解:在setup 中添加gesture,或者重写以下方法处理用户交互
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{} -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{} -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{} -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{}
注意:drawInRect:是在main queue 中进行的,如果drawInRect:很复杂,或者需要绘制很多view, app 可能会卡。
对于这种情况,考虑concurrently build interface(参考wwdc视频,后续有随笔专门总结如何实现)
用draw 的方法添加view内容,代码复杂,但可以做到真正的customization
二、load from nib
1)新建view nib 文件,在ib中拖拽添加view的内容(注意view 的class 为custom view 的class),并设置constraint(如何设置constraint,将另有随笔总结)。
2)可用以下语句直接创建view
[[[NSBundle mainBundle]loadNibNamed:@"xib file name " owner:nil options:nil] lastObject];
好处(前提是熟悉ib):
1.方便快速的添加内容、设置iboutlet 和ibaction、添加gesture等
2.便于 localization
3.便于设置constraint
三、add subviews
这种方法比较直接,在setup中增加subviews 就可以了(这里不适合设置frame等geometry信息),
但好像运行效率比较低