一,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];
    }];
}