sizeThatFits和sizeToFit

2018/7/20 posted in  iOS

今天帮同事看一个布局约束的问题,(代码也是从别人手中接过来的,所以并不清楚怎么布局的)
view是用xib画的,约束设置很多,本以为是约束的问题,设置了约束还是不能更改整个view的高度。

最后找了一会,我发现了一个方法 sizeThatFit 在sizeThatFit内部返回了size,所以刚才尽管指定的约束改了,但是还是不影响下面的方法返回size。

所以就写了这个东西给不了解的同学一点点经验。

- (void)sizeToFit;                       // calls sizeThatFits: with current view bounds and changes bounds size.
- (CGSize)sizeThatFits:(CGSize)size;     // return 'best' size to fit given size. does not actually resize view. Default is return existing view size

上面是苹果的方法说明。

sizeToFit 方法会返回一个苹果自带方法计算出的合适的宽高,即使你初始化的时候的宽和高设置错误,苹果也会给你算出一个合适的size让你填充你的内容。

-(void)addSizeToFitHelloLable{
    
    UILabel * hello = [[UILabel alloc]initWithFrame:CGRectMake(20, 20, 20, 100)];
    hello.text = @"hello world";
    hello.backgroundColor = [UIColor redColor];
    [self.view addSubview:hello];
    [hello sizeToFit];
    
}

我这里设置的宽度和高度明显是不对的,但是当我调用sizeToFit之后就好多了,下面是调用前和调用之后的对比效果。

  • 调用之前
    屏幕快照 2018-11-27 下午3.23.49

  • 调用之后
    屏幕快照 2018-11-27 下午3.23.06

因为sizeToFit之后内部会调用调用sizeThatFits,所以还可以在自定义view当中重写sizeThatFits方法,去调整sizeToFit之后的size。

----------customLable.m-------------
-(CGSize)sizeThatFits:(CGSize)size{
    
    [super sizeThatFits:size];
    size.height = 40;
    return size;
    
}

注意

添加自定义的lable到view上最后千万不能忘记调用sizeToFit方法,要不然内部重写的sizeThatFits不生效。

-(void)addCustomeSizeThatFitLable{
    
    CustomLable * hello = [[CustomLable alloc]initWithFrame:CGRectMake(20, 20, 200, 100)];
    hello.text = @"hello world";
    hello.backgroundColor = [UIColor redColor];
    [self.view addSubview:hello];
    [hello sizeToFit]; 
}