一,view的布局方法
1, 适应: - (CGSize)sizeThatFits:(CGSize)size;和- (void)sizeToFit;方法
- sizeToFit 自动调用 sizeThatFits 方法,不能在子类中重写 sizeToFit,可以重写sizeThatFits;
- sizeThatFits传入的参数是receiver当前的size,返回一个适合的size;
- sizeThatFits和sizeToFit可以被手动直接调用
- 例如[testLabel sizeToFit];//会计算出最优的 size 而且会改变自己的size
- [testLabel sizeThatFits:CGSizeMake(20, 20)];//会计算出最优的 size 但是不会改变 自己的 size
2,布局: - (void)layoutSubViews;和 - (void)layoutIfNeeded;和- (void)setNeedsLayout ;
- -layoutSubviews方法:这个方法,默认没有做任何事情,需要子类进行重写
- -setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用
- -layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)
- 视图第一次显示前:直接调用[view layoutIfNeeded]
- 视图立即刷新:先调用[view setNeedsLayout],把标记设为需要布局;然后马上调用[view layoutIfNeeded],实现布局
- layoutSubviews 在以下情况下会被调用:
1, init初始化不会触发 layoutSubviews,但是 initWithFrame 进行初始化会被调用,当 rect 的值不为 CGRectZero 时,也会触发。
2,addSubView会触发 layoutSubviews
3,设置 view的 frame 会触发 layoutSubviews
4,滚动 ScrollView 时会触发 layoutSubviews
5,旋转 Screen 会触发 父view 上的 layoutSubviews
6,改变一个 view的大小也会触发父view的 layoutSubviews,所以重写这个方法要调用 [super layoutSubViews]
3,绘制:- (void)setNeedsDisplay;和- (void)drawRect;-setNeedsDisplayInRect:(CGRect)invalidRect方法
drawRect是对receiver的重绘,能获得context
setNeedDisplay在receiver标上一个需要被重新绘图的标记,在下一个draw周期自动重绘,iphone device的刷新频率是60hz,也就是1/60秒后重绘
-setNeedsDisplayInRect:(CGRect)invalidRect方法:标记为需要局部重绘
4,总结:
内部重写:drawRect,layoutSubviews,sizeThatFits
外部标记:setNeedDisplay,layoutIfNeeded(第一次刷新),[view setNeedsLayout]和[view layoutIfNeeded](立即刷新),sizeToFit
调用顺序:layoutSubviews方法调用先于drawRect
二,自定义view的方法
调整布局用layout相关;
重绘内容用drawRect相关;
调整内容用fit相关;
三,自定义view的加载方式
1,纯代码加载
内部设置:
- 1,初始化:initWithFrame
- 2,布局:layoutSubviews(frame布局),不用layoutSubviews(autoLayou布局,translatesAutoresizingMaskIntoConstraints 属性设为 NO),不用layoutSubviews(使用masory布局)
- 3,适应:sizeThatFits
外部调用:
init的初始化方法
2,xib或者storyboard加载
内部设置:
initWithcoder:只要是从storyboard/xib中加载就会调用这个方法;这个方法一般是初始化的操作
awakeFromNib:storyboard/xib中加载完毕的时候调用,想做一些在xib加载完毕的操作,就在这个方法中操作(建议在这个方法中写初始化代码)
外部调用:
方式一:通过mainBundel loadNibNamed:加载
NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"xib文件名" owner:nil options:nil]`
- 方式二:通过`UINib` `nibWithNibName`加载
UINib *nib = [UINib nibWithNibName:@"xib文件名" bundle:nil];
NSArray *views = [nib instantiateWithOwner:nil options:nil];
四,view调用时添加动画
可以重写父类的方法,
添加动画:
-(void)layoutSubviews{
CGRect frame = _bgView.frame;
frame.origin.y += keyboardHeight + bgHeight;
_bgView.frame = frame;
[UIView animateWithDuration:0.3f animations:^{
CGRect frame = _bgView.frame;
frame.origin.y -= (keyboardHeight + bgHeight);
_bgView.frame = frame;
} completion:^(BOOL finished) {
}];
}
删除动画:
- (void) removeFromSuperview {
[UIView animateWithDuration:0.2 animations:^{
self.alpha = 0.0;
[self setFrame:CGRectMake(self.frame.origin.x+50, self.frame.origin.y+50, 0, 0)];
[_btnDel setFrame:CGRectMake(0, 0, 0, 0)];
}completion:^(BOOL finished) {
[super removeFromSuperview];
}];
}