1.
UIView 有个 sizeToFit 方法来计算 UIView 合适的 bounds.size, 注意 autolayout 约束过的 view 该方法失效.
testLabel.numberOfLines = 0; ///相当于不限制行数,对sizeToFit也会有影响
2.
- (void)sizeToFit
- (CGSize)sizeThatFits:(CGSize)size
解释如下:
调用sizeToFit会自动调用sizeThatFits方法;
sizeToFit不应该在子类中被重写,应该重写sizeThatFits
sizeThatFits传入的参数是receiver当前的size,返回一个适合的size
sizeToFit可以改变UIView的frame,sizeThatFits不会改变UIView的frame
sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己
3.
NSString 对label有用的方法,如下:
Computing Metrics for a Single Line of Text(针对单行的文字)
– sizeWithFont:
– sizeWithFont:forWidth:lineBreakMode:
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:
Computing Metrics for Multiple Lines of Text(针对多行的文字,这个常用)
– sizeWithFont:constrainedToSize:
– sizeWithFont:constrainedToSize:lineBreakMode:
我们经常会根据label里面的文字的多少,来计算label的尺寸,例如做微博的cell的时候
我们经常会用“sizeWithFont:constrainedToSize:”来获得size,以此改变label的尺寸
其实,这个可以用label 的“sizeToFit”来替代,当label调用“sizeToFit”时,会自动改变label本身的尺寸,所以这个方法是没有返回值的。如果对“”的计算不满意,可以继承UILabel来自定义label,同时重写label的“sizeThatFits:”方法,这样自定义label的“sizeToFit”行为就会被改变。
4.实例
其实当调用 UIView 的 sizeToFit 后 会调用 sizeThatFits 方法来计算 UIView 的 bounds.size 然后改变 frame.size
#import "MyLabel.h"
@interface MyLabel()
{
CGSize _cacheSize1;
}
@end
@implementation
- (instancetype)initWithFrame:(CGRect)frame
{
//第一步
self = [super initWithFrame:frame];
if (self) {
_label1 = [UILabel new];
_label1.numberOfLines = 0;
_label1.backgroundColor = [UIColor orangeColor];
}
return self;
}
- (void)layoutSubviews{
[super layoutSubviews];
//第三步
_label1.frame= //根据_cacheSize1 计算Label frame;
}
- (CGSize)sizeThatFits:(CGSize)size
{
//第二步
CGFloat w = size.width;
_label1.text = @"测试文本";
_cacheSize1 = [_label1 sizeThatFits:CGSizeMake(w, MAXFLOAT)];
return CGSizeMake(size.width, 自定义高度);
}
@end
调用
MyLabel *customerView = [[MyLabel alloc] init];
[customerView sizeToFit];
[self.view addSubview:customerView];