sizeThatFits 和 sizeToFit的区别
来源:互联网 发布:mac免费游戏推荐 编辑:程序博客网 时间:2024/06/05 11:28
一 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 可以子类化重写自己的计算规则
- sizeThatFits 和 sizeToFit的区别
- sizeThatFits 和 sizeToFit区别
- sizeToFit与sizeThatFits的使用和区别
- sizeThatFits和sizeToFit
- UILabel如何使用sizeToFit进行宽高适配 和 sizeThatFits 以及实现总是顶端显示text的需求
- sizeThatFits and sizeToFit
- sizeThatFits and sizeToFit
- sizeThatFits and sizeToFit
- sizeThatFits and sizeToFit
- sizeThatFits and sizeToFit是UIView的两个方法
- sizeThatFits and sizeToFit是UIView的两个方法
- iOS: UILabel的adjustsFontSizeToFitWidth与 sizeToFit与sizeThatFits
- ios开发点滴-UILable 根据文字内容进行大小设置 sizeThatFits和sizeToFit
- ios开发点滴-UILable 根据文字内容进行大小设置 sizeThatFits和sizeToFit
- sizeThatFits and sizeToFit是UIView的两个方法, 官方文档上说:
- UIView的sizeToFit:和fitSize方法
- UIView的sizeToFit:和fitSize方法
- sizeToFit和sizeThatFit
- Lua的系统学习(杂)_使用uLua在Unity中创建一个Sphere小球
- 列表和元组常用操作【python】
- (4.6.27)Android启动优化之打造秒开应用
- PC端google chrome真正实现地理位置模拟,HTML5
- Kubernetes GarbageCollector
- sizeThatFits 和 sizeToFit的区别
- Activity生命周期及其是否可见
- Linux环境下numpy,scipy,matplotlib的安装
- ES6 展望
- 凯撒密码
- hdu 5521 Meeting
- Android性能优化总结
- java jackcess 操作 access
- 关于SEA使用的步骤例子