博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 使用 boundingRectWithSize: 计算 UILabel 高度错误的解决方案 高度不对
阅读量:2092 次
发布时间:2019-04-29

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

原文地址:

在使用boundingRectWithSize: 计算 UILabel 高度,显示出来后 Label 内容显示不全,这种情况怎么治呢?

Demo地址:

分析后可能存在的两个原因:

1.使用boundingRectWithSize:计算时传入的相关属性与实际显示的 UILabel 属性不一致,例: @{NSFontAttributeName:[UIFont systemFontOfSize:16]},计算时传入的字体大小为16,实际显示的大小为17;这里字体只是个例子,明眼人都知道,可是往往忽略的还有 lineBreakMode ,alignment等等;

解决方法:使用 NSMutableParagraphStyle 设置相关属性

2.计算出来的 height 正好是排版后的高度大小,是 CGFloat 类型,在是在我们设置UIlabel/Cell 高度时,可能存在四舍五入等,最后存在的一点点误差使得 UILabel 显示不全,可能出现缺少一行,上下空白太多等情况;

解决方案:为了确保布局按照我们计算的数据来,可以使用ceil函数对计算的 Size 取整,再加1,确保 UILabel按照计算的高度完好的显示出来; 或者使用方法CGRectIntegral(CGRect rect) 对计算的 Rect 取整,在加1;

NSString*text = _datasource[indexPath.row];// 段落设置与实际显示的 Label 属性一致 采用 NSMutableParagraphStyle 设置Nib 中 Label 的相关属性传入到 NSAttributeString 中计算;

NSMutableParagraphStyle*style = [[NSParagraphStyledefaultParagraphStyle] mutableCopy];   

style.lineBreakMode =NSLineBreakByWordWrapping;   

style.alignment =NSTextAlignmentLeft;

NSAttributedString*string = [[NSAttributedStringalloc]initWithString:text attributes:@{NSFontAttributeName:[UIFontsystemFontOfSize:16],NSParagraphStyleAttributeName:style}];

CGSizesize =  [string boundingRectWithSize:CGSizeMake(200.f, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeadingcontext:nil].size;

NSLog(@" size =  %@",NSStringFromCGSize(size));

// 并不是高度计算不对,我估计是计算出来的数据是 小数,在应用到布局的时候稍微差一点点就不能保证按照计算时那样排列,所以为了确保布局按照我们计算的数据来,就在原来计算的基础上 取ceil值,再加1;

CGFloatheight = ceil(size.height) +1;

还有一种方法,可以达到相同的效果。采用 UILabel 的 -sizeThatFits:方法;

UILabel *label = [[UILabel alloc]init];label.numberOfLines = 0;label.lineBreakMode = NSLineBreakByWordWrapping;label.textAlignment = NSTextAlignmentLeft;label.text = text;label.font = [UIFont systemFontOfSize:16];CGSize labelSize = [label sizeThatFits:CGSizeMake(200.f, MAXFLOAT)];CGFloat height = ceil(labelSize.height) +1;

测试正常:

CalculateHeightForUILabel.png

Demo地址:

 

转载地址:http://qcwhf.baihongyu.com/

你可能感兴趣的文章
tomcat连接超时
查看>>
强引用 软引用 弱引用 虚引用
查看>>
数据类型 java转换
查看>>
"NetworkError: 400 Bad Request - http://172.16.47.117:8088/rhip/**/####t/approval?date=976
查看>>
mybatis 根据 数据库表 自动生成 实体
查看>>
C结构体、C++结构体、C++类的区别
查看>>
进程和线程的概念、区别和联系
查看>>
CMake 入门实战
查看>>
Linux下perf性能测试火焰图只显示函数地址不显示函数名的问题
查看>>
c结构体、c++结构体和c++类的区别以及错误纠正
查看>>
Linux下查看根目录各文件内存占用情况
查看>>
A星算法详解(个人认为最详细,最通俗易懂的一个版本)
查看>>
利用栈实现DFS
查看>>
(PAT 1019) General Palindromic Number (进制转换)
查看>>
(PAT 1080) Graduate Admission (排序)
查看>>
Play on Words UVA - 10129 (欧拉路径)
查看>>
mininet+floodlight搭建sdn环境并创建简答topo
查看>>
【linux】nohup和&的作用
查看>>
Set、WeakSet、Map以及WeakMap结构基本知识点
查看>>
【NLP学习笔记】(一)Gensim基本使用方法
查看>>