今天帮同事看一个布局约束的问题,(代码也是从别人手中接过来的,所以并不清楚怎么布局的)
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之后就好多了,下面是调用前和调用之后的对比效果。
调用之前
调用之后
因为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];
}