os6, ios7上文字长度计算问题, 可变长文字的自动适配显示
2014-08-18 11:59
190 查看
原文 /article/1564286.html
在iOS中,经常遇到需要根据字符串的内容动态指定UILabel,UITextView,UITableViewCell等的高度的情况,这个时候就需要动态的计算字符串内容的高度,下面是计算的方法:
最新遇到一个问题,需要显示一个可变长度的文本文字。 通常我们会先计算这部分文字需要显示出来的高度值,然后把这个高度值设置成UITextView的高度值。这样就做到了自动适配显示。
1. 之前我们是采用网上说的那种方式,
+ (float) heightForTextView: (UITextView *)textView WithText: (NSString *) strText{
float fPadding = 16.0; // 8.0px x 2
CGSize constraint = CGSizeMake(textView.contentSize.width - fPadding, CGFLOAT_MAX);
CGSize size = [strText sizeWithFont: textView.font constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
float fHeight = size.height + 16.0;
return fHeight;
}
结果发现在ios6上计算出的长度根本不对, 会致使有一部分文字显示不出来的情况。但在ios7上上面这部分代码是正确的。注:ios6, ios7对同样的文字内容,即使使用的是相同的文字大小,计算出来的高度也是不一样的。
注:今天发现, 上面这个方法在真机上是正常的,在XCode 5的模拟器上ios6上会有问题。 这应该是XCode 5的ios6模拟器的一个bug, 供各位参考
2. 后来自己再尝试了一番, 终于找到一个好的办法来解决这个问题。(个人觉得下面这种方法比较赞,下面这种方法不需要考虑上面方法中的 UITextView的 8 padding问题,相对比较容易理解)
+ (float) heightForString:(NSString *)value fontSize:(float)fontSize andWidth:(float)width
{
UITextView *detailTextView = [[UITextViewalloc]initWithFrame:CGRectMake(0,
0, width, 0)];
detailTextView.font = [UIFontsystemFontOfSize:fontSize];
detailTextView.text = value;
CGSize deSize = [detailTextViewsizeThatFits:CGSizeMake(width,CGFLOAT_MAX)];
return deSize.height;
}
自己测试使用过, ios6, ios7上均能计算出正常的值, 虽然同样的内容,同样的文字大小,计算出来的高度还是不一样。
3. 在网上查了一下, 有的说是用UILabel试一下, 配合CGSize size = [strText sizeWithFont: textView.font constrainedToSize:constraint
lineBreakMode:UILineBreakModeWordWrap]; 这种方式也可以得正常的显示值, (注意:在使用UILabel来时,计算文字高度时, 不需要像上面第一部分代码中搞一个8 padding)
经验证:
sizeWithFont这个方法貌似确实是针对UILabel的,如果用UILabel来显示,其计算出来的高度和实际高度是吻合的。但是需要注意的是UILabel的文字内容和UILabel的宽度几乎是重合的,这会让人觉得文字太过于帖边了,可以考虑设置其contentInset之类来处理,不过这个是另一个问题了。而UITextView则不会太帖边,且行间距较大,适合显示。
估计UILabel应该也可以设置其行间距和段间距的。
在iOS中,经常遇到需要根据字符串的内容动态指定UILabel,UITextView,UITableViewCell等的高度的情况,这个时候就需要动态的计算字符串内容的高度,下面是计算的方法:
/** @method 获取指定宽度情况ixa,字符串value的高度 @param value 待计算的字符串 @param fontSize 字体的大小 @param andWidth 限制字符串显示区域的宽度 @result float 返回的高度 */ - (float) heightForString:(NSString *)value fontSize:(float)fontSize andWidth:(float)width { CGSize sizeToFit = [value sizeWithFont:[UIFont systemFontOfSize:fontSize] constrainedToSize:CGSizeMake(width, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];//此处的换行类型(lineBreakMode)可根据自己的实际情况进行设置 return sizeToFit.height; }
最新遇到一个问题,需要显示一个可变长度的文本文字。 通常我们会先计算这部分文字需要显示出来的高度值,然后把这个高度值设置成UITextView的高度值。这样就做到了自动适配显示。
1. 之前我们是采用网上说的那种方式,
+ (float) heightForTextView: (UITextView *)textView WithText: (NSString *) strText{
float fPadding = 16.0; // 8.0px x 2
CGSize constraint = CGSizeMake(textView.contentSize.width - fPadding, CGFLOAT_MAX);
CGSize size = [strText sizeWithFont: textView.font constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
float fHeight = size.height + 16.0;
return fHeight;
}
结果发现在ios6上计算出的长度根本不对, 会致使有一部分文字显示不出来的情况。但在ios7上上面这部分代码是正确的。注:ios6, ios7对同样的文字内容,即使使用的是相同的文字大小,计算出来的高度也是不一样的。
注:今天发现, 上面这个方法在真机上是正常的,在XCode 5的模拟器上ios6上会有问题。 这应该是XCode 5的ios6模拟器的一个bug, 供各位参考
2. 后来自己再尝试了一番, 终于找到一个好的办法来解决这个问题。(个人觉得下面这种方法比较赞,下面这种方法不需要考虑上面方法中的 UITextView的 8 padding问题,相对比较容易理解)
+ (float) heightForString:(NSString *)value fontSize:(float)fontSize andWidth:(float)width
{
UITextView *detailTextView = [[UITextViewalloc]initWithFrame:CGRectMake(0,
0, width, 0)];
detailTextView.font = [UIFontsystemFontOfSize:fontSize];
detailTextView.text = value;
CGSize deSize = [detailTextViewsizeThatFits:CGSizeMake(width,CGFLOAT_MAX)];
return deSize.height;
}
自己测试使用过, ios6, ios7上均能计算出正常的值, 虽然同样的内容,同样的文字大小,计算出来的高度还是不一样。
3. 在网上查了一下, 有的说是用UILabel试一下, 配合CGSize size = [strText sizeWithFont: textView.font constrainedToSize:constraint
lineBreakMode:UILineBreakModeWordWrap]; 这种方式也可以得正常的显示值, (注意:在使用UILabel来时,计算文字高度时, 不需要像上面第一部分代码中搞一个8 padding)
经验证:
sizeWithFont这个方法貌似确实是针对UILabel的,如果用UILabel来显示,其计算出来的高度和实际高度是吻合的。但是需要注意的是UILabel的文字内容和UILabel的宽度几乎是重合的,这会让人觉得文字太过于帖边了,可以考虑设置其contentInset之类来处理,不过这个是另一个问题了。而UITextView则不会太帖边,且行间距较大,适合显示。
估计UILabel应该也可以设置其行间距和段间距的。
相关文章推荐
- iOS6,iOS7文字长度计算问题,可变长文字的自动适配显示
- ios6, ios7上文字长度计算问题, 可变长文字的自动适配显示
- 含软连字符的字符串计算显示长度的问题
- 文字过长,QLabel显示不全的问题,QLabel怎么自动分行显示
- 含软连字符的字符串计算显示长度的问题
- 含软连字符的字符串计算显示长度的问题
- ios7,ios8中UITextView文字会自动垂直居中的问题
- 自定义TextView任意长度文本下自动改变文字大小以完全显示
- 为CListBox垂直滚动条,自动滚动,文字显示不全问题!
- 使用纯CSS实现文字超过一定的长度后自动显示省略号
- 用mansard对cell的子控件设置约束,并且自动计算cell高度的问题,ios7警告
- 在一个label 中显示多行,并自动换行 (计算行的高度,text的长度,大小等。)
- C#contextmenustrip长度问题 右键快捷菜单上的文字不能完全显示
- wpf 文字显示出来后自动模糊的问题 TextOptions.TextFormattingMode="Display"
- asp.net截取和计算中文和英文长度的问题!
- 打开OPENGL真的能提高魔兽争霸III/魔兽世界的速度吗?(文字只显示一半,卡之类问题)
- XP自动关闭高级文字服务,语言栏不能显示,也不能在区域和语言选项中更改过来
- 使用POI处理Excel中公式不能自动计算出来的问题
- 让超出DIV宽度范围的文字自动显示省略号...
- 怎样编写支持多国语言的程序, 让它能够根据所运行的操作系统自动显示相应的文字。