sizeToFit 和 sizeThatFits
ChenghuiBai Lv3

[toc]

sizeToFit

sizeToFit: 会计算出最优的 size 而且会改变自己的size

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 0, 0)];
label.backgroundColor = UIColor.grayColor;
label.font = [UIFont systemFontOfSize:20];
label.text = @"上海欢迎你!!!";

//sizeToFit: 直接改变了label的宽和高, 使它根据上面的字符串的大小做合适的改变
[label sizeToFit];

NSLog(@"width = %.0f height = %.0f",label.frame.size.width, label.frame.size.height);
[self.view addSubview:label];

//输出结果:
width = 119 height = 24

注意: 使用sizeToFit时, 一定要设置控件的frame, 并且不可以使用Masonry, 否则sizeToFit将失效

sizeThatFits

sizeThatFits: 会计算出最优的 size 但是不会改变 自己的size

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 0, 0)];
label.backgroundColor = UIColor.grayColor;
label.font = [UIFont systemFontOfSize:20];
label.text = @"上海欢迎你!!!";

//sizeThatFits并没有改变原始label的大小
CGSize sizeThatFits = [label sizeThatFits:CGSizeZero];
NSLog(@"sizeThatFits: width = %.1f height = %.1f", sizeThatFits.width, sizeThatFits.height);

NSLog(@"label: width = %.1f height = %.1f",label.frame.size.width, label.frame.size.height);

[self.view addSubview:label];


输出结果:
sizeThatFits: width = 119.0 height = 24.0
label: width = 0.0 height = 0.0

iOS sizeToFit 和 sizeThatFits的联系

如果你的控件对尺寸有严格的限定,比如有一个统一的宽高比或者是固定尺寸,那么最好能实现系统给出的约定成俗的接口。
sizeToFit 用在基于 frame 布局的情况下,由你的控件去实现 sizeThatFits: 方法:

- (CGSize)sizeThatFits:(CGSize)size {
CGSize fitSize = [super sizeThatFits:size];
fitSize.height += self.label.frame.size.height;
// 如果是固定尺寸,就像 UISwtich 那样返回一个固定 Size 就 OK 了
return fitSize;
}

然后在外部调用该控件的 sizeToFit 方法,这个方法内部会自动调用 sizeThatFits 并更新自身的 Size:

[self.customView sizeToFit]; 
  • Post title:sizeToFit 和 sizeThatFits
  • Post author:ChenghuiBai
  • Create time:2017-05-01 11:01:08
  • Post link:https://baichenghui.github.io/2017/05/01/sizeToFit-和-sizeThatFits/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.