博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sizeThatFits 和 sizeToFit的区别
阅读量:6850 次
发布时间:2019-06-26

本文共 3263 字,大约阅读时间需要 10 分钟。

代码部分 : https://github.com/ZhaoBingDong/CAAnimaiton

一 sizeThatFits 和 sizeToFit的区别

UIView 有个 sizeToFit 方法来计算 UIView 合适的 bounds.size, 注意 autolayout 约束过的 view 该方法失效.

- (void)sizeToFit;           // calls sizeThatFits: with current view bounds and changes bounds size.调用这个方法会改变当前 view 的 bounds.size 复制代码
- (CGSize)sizeThatFits:(CGSize)size;     // return 'best' size to fit given size. does not actually resize view. Default is return existing view size// 意思大概是 返回“最佳”大小适合给定的大小 默认返回已经存在的视图 size复制代码

当一个 view 例如 label 设置完 text 属性后 调用[label sizeToFit]; 会根据 label 内容计算出合适的 size 来完全显示 label 内容

UILabel *label1          = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 100.0f, 0.0f, 0.0f)];    label1.backgroundColor   = [UIColor yellowColor];    label1.text              = @"当一个 view 例如 label 设置完 text 属性后 调用[label sizeToFit]; 会根据 label 内容计算出合适的 size 来完全显示 label 内容";    label1.numberOfLines     = 0;    [label1 sizeToFit];        [self.view addSubview:label1];复制代码

上边的方法 如果不设定 label 的 frame.size.with 那么 label 会自适应宽度 而不会改变它的高度,所以 label 虽然设置了 numberOfLines = 0 ,依然无法换行 .大部分应用当文字一行显示不完全时需要给 label 换行,那么就要限定 label 的 maxWidth

还是同样的代码 由于我指定了 label 的 width = 100.0f ,在 [label sizeToFit] 会发现 label 的最大 with =100 显示不完全部分换行 高度自适应.

所以 sizeToFit 并不能够完全按我们设想的哪样去自适应 label 的 bounds.size

那么 sizeToFit 内部到底做了哪些操作呢?

其实当调用 UIView 的 sizeToFit 后 会调用 sizeThatFits 方法来计算 UIView 的 bounds.size 然后改变 frame.size

UIView 的 - (CGSize)sizeThatFits:(CGSize)size {        CGSize newSize = [super sizeThatFits:size];    NSLog(@"size =%@",NSStringFromCGSize(newSize));        return newSize;    }不妨将上边代码部分发 UILabel 改成子类化的 MyLabel 重写sizeThatFits 打印出  newSize ={99, 223.5}复制代码

其实我们也可以不使用 [ label sizeToFit] 来计算 label 内容的 size ,首先调用 sizeThatFits 方法或者一个 CGSize 然后改变 label.frame.size 就可以得到 [label sizeToFit]一样的效果

// 或者给一个限定的宽度和高度 让 label 在这个范围内进行自适应 size    CGSize labelSize = [label1 sizeThatFits:CGSizeMake([[UIScreen mainScreen] bounds].size.width, MAXFLOAT)];    CGRect rect      = CGRectMake(label1.frame.origin.x, label1.frame.origin.y, labelSize.width, labelSize.height);    [label1 setFrame:rect];复制代码

由此可见 sizeThatFits 比 sizeToFit 更加灵活的设置一个自适应size 的 view , 可以定制 label 计算内部内容的规则

下边是重写子类 sizeThatFits 自定义的一个 计算label siztToFit 后改变 frame.size 的方法

- (void)layoutSubviews{    [super layoutSubviews];        _label1.frame = CGRectMake(_margin, _margin, _cacheSize1.width, _cacheSize1.height);    _label2.frame = CGRectMake(_margin, CGRectGetMaxY(_label1.frame) + _margin, _cacheSize2.width, _cacheSize2.height);}- (CGSize)sizeThatFits:(CGSize)size{    CGFloat w = size.width;    w -= 2 * _margin;        _cacheSize1 = [_label1 sizeThatFits:CGSizeMake(w, MAXFLOAT)];    _cacheSize2 = [_label2 sizeThatFits:CGSizeMake(w, MAXFLOAT)];    CGFloat h = 3 * _margin + _cacheSize1.height + _cacheSize2.height;        return CGSizeMake(size.width, h);}复制代码

当你调用 自定义 View 的 sizeToFit 方法后 会根据自定义的 sizeThatFits:(CGSize)size 规则来计算 label 来改变 label 完全内容的 size

TestSizeFit *customerView = [[TestSizeFit alloc] init];    [customerView setLabel1Text:@"大兵布莱恩特" setLabel2Text:@"巴爷科技 (上海) 有限公司"];        [customerView sizeToFit];        [self.view addSubview:customerView];复制代码

通过上边的代码示例 可以知道 sizeToFit 方法背后怎么实现的 , sizeThatFits 可以子类化重写自己的计算规则

好了,我是大兵布莱恩特,欢迎加入博主技术交流群,iOS 开发交流群

转载于:https://juejin.im/post/5b46e65ae51d4519490905f3

你可能感兴趣的文章
eoLinker上线两周年+ AMS V4.0 发布:全新UI界面,带来领先的API开发管理解决方案!...
查看>>
Android 反编译
查看>>
高效开发 Dubbo?用 Spring Boot 可得劲!
查看>>
中国联通把百度指向了127.0.0.1?
查看>>
Java程序员这样优化简历,一投制胜!
查看>>
runtime(消息转发)
查看>>
设计模式——建造者模式
查看>>
Async & generator & Promise
查看>>
解决vagrant ssh登录时permission deny的问题
查看>>
Dapper,大规模分布式系统的跟踪系统
查看>>
Spring源码之XMLBeanFactory
查看>>
PopupWindow 点击外部区域无法关闭的问题
查看>>
jQuery 遍历
查看>>
开源的丰富的flutter Icons库
查看>>
内存管理Release和Retain实现原理
查看>>
(JVM 笔记)Java虚拟机:Java 内存管理
查看>>
一分钟读懂兼容报告——行业对标数据助你定位产品状况
查看>>
Axure RP 7.0从入门到精通 Web+APP产品经理原型设计 彩色pdf扫描版
查看>>
点击H5页面的时候出现阴影
查看>>
js实现一个按照权重抽奖函数
查看>>