sizeThatFits 和 sizeToFit的区别

本文探讨了UILabel的sizeToFit及sizeThatFits方法的使用,解析了它们如何帮助UILabel根据内容自动调整大小。介绍了计算文本尺寸的NSString方法,如sizeWithFont系列,并通过实例展示了如何自定义UILabel以实现更灵活的布局控制。
摘要由CSDN通过智能技术生成

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];

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值