[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 = @"上海欢迎你!!!";
[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 = @"上海欢迎你!!!";
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; return fitSize; }
|
然后在外部调用该控件的 sizeToFit 方法,这个方法内部会自动调用 sizeThatFits 并更新自身的 Size:
[self.customView sizeToFit]
|