关闭

IOS8.4下用- (CGRect)boundingRectWithSize: options: attributes: context:计算文本高度会崩溃的问题

2308人阅读 评论(1) 收藏 举报
分类:

这几天遇到一个计算文本高度的坑,这里记录一下。

我最开始在计算一段文本的高度的时候用的下面的代码:

CGSize msgWH = [_MsgModel.msg boundingRectWithSize:CGSizeMake(WBScreenW - msgX, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont fontWithName:@"PingFang SC" size:13]} context:nil].size;

然后就出现了下面这个问题

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Triggered by Thread:  0

Last Exception Backtrace:
0   CoreFoundation                  0x18546c2d8 __exceptionPreprocess + 132
1   libobjc.A.dylib                 0x1971380e4 objc_exception_throw + 60
2   CoreFoundation                  0x1853589c8 -[__NSPlaceholderDictionary initWithObjects:forKeys:count:] + 420
3   CoreFoundation                  0x1853587f8 +[NSDictionary dictionaryWithObjects:forKeys:count:] + 72

后面就参考这篇帖子
http://stackoverflow.com/questions/13621084/boundingrectwithsize-for-nsattributedstring-returning-wrong-size
改成下面这样:

NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"PingFang SC" size:13], NSFontAttributeName,nil, NSForegroundColorAttributeName,nil];
NSMutableAttributedString *string =[[NSMutableAttributedString alloc] initWithString: _MsgModel.msg attributes:attributesDictionary];
CGSize msgWH = [string boundingRectWithSize:CGSizeMake(WBScreenW - msgX - WBSpacing, MAXFLOAT) options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) context:nil].size;

然后程序就不会crash了,但是在IOS9以下的版本会出现字体显示问题,字体变的很小,而且会影响到别的栏位,在IOS9以上的版本则一切正常,后面发现是[UIFont fontWithName:@”PingFang SC” size:13]这个字体的原因,PingFang SC这个字体是IOS9.0.2以后才有的,所以在IOS8上才会有这个问题,这也是为什么最开始的那种写法会导致程序崩溃的原因,因为在IOS8的系统下,@{NSFontAttributeName:[UIFont fontWithName:@”PingFang SC” size:13]}会导致crash,可以参考http://www.tuicool.com/articles/Y3EfAv7,然后就把字体改为使用系统字体就正常了。

后面又发现个别手机在IOS9.3下又crash了:

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Triggered by Thread:  0

Filtered syslog:
None found

Last Exception Backtrace:
0   CoreFoundation                  0x18357adb0 __exceptionPreprocess + 124
1   libobjc.A.dylib                 0x182bdff80 objc_exception_throw + 56
2   CoreFoundation                  0x18357acf8 +[NSException raise:format:] + 120
3   Foundation                      0x183e698f0 -[NSConcreteMutableAttributedString initWithString:attributes:] + 136

log说是NSMutableAttributedString *string =[[NSMutableAttributedString alloc] initWithString: _MsgModel.msg attributes:attributesDictionary];的问题,然后我又换了种写法

NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont systemFontOfSize:13], NSFontAttributeName,nil, NSForegroundColorAttributeName,nil];

CGSize msgWH = [_MsgModel.msg boundingRectWithSize:CGSizeMake(WBScreenW - msgX, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributesDictionary context:nil].size;
1
0
查看评论

我们经常遇到的一些Crash和Bug

一,Unknown type name ....    如果是报这个错误,多半是你的对象类型没有被识别,检查是不是没有引用对应的库或者头文件在你的文件头部分,还有可能是循环引用导致的,循环引用的解决方法就是  Class A 中用import Clas...
  • dean19900504
  • dean19900504
  • 2013-09-25 14:38
  • 6034

iOS NSAttributeString 通过boundingRectWithSize 获取高度不准确问题

iOS 开发使用富文本,NSAttributeString,通过boundingRectWithSize 获取高度不准确 但是使用 sizeThatFits 却可以准确获取高度,不知道怎么回事,求大神解答
  • xuchuandong520
  • xuchuandong520
  • 2016-12-04 16:24
  • 1146

UILabel自适应大小的新方法boundingRectWithSize:options:attributes:context:

iOS7以前我们对UILabel进行根据内容自适应大小的时候会使用方法
  • liyux4869
  • liyux4869
  • 2014-09-06 13:35
  • 3148

ios boundingRectWithSize 使用方法 例子

ios boundingRectWithSize 方法使用 此方法是ios中计算有属性的文字所需要占有的空间矩形. 直接上Demo代码: UILabel *lbTemp =[[UILabel alloc] initWithFrame:CGRectMake(20, 20, 100, 700)]...
  • jxjgssylsg
  • jxjgssylsg
  • 2016-04-27 17:33
  • 2224

iOS 使用 boundingRectWithSize: 计算 UILabel 高度错误的解决方案

转: http://www.jianshu.com/p/c2b8a7940d4d 在使用boundingRectWithSize: 计算 UILabel 高度,显示出来后 Label 内容显示不全,这种情况怎么治呢? Demo地址:Demo github 地址 分析...
  • smilebigdear
  • smilebigdear
  • 2017-04-11 15:53
  • 1700

使用boundingRectWithSize计算内容高度的坑

iOS中,根据给定的内容、字体,宽度,计算文本高度的函数,iOS7之前使用sizeWithFont,iOS7之后使用boundingRectWithSize。- boundingRectWithSize:options:attributes:context: Calculates and retur...
  • xjkstar
  • xjkstar
  • 2015-07-31 10:35
  • 4568

ios 上传app提示miss 64-bit support警告

ios 上传app提示miss 64-bit support警告 最近上传app提示了这个警告问题,记录一下 App store 发布,64位问题,Missing 64-bit support
  • gloryFlow
  • gloryFlow
  • 2015-01-04 14:58
  • 1800

IOS BUG记录 boundingRectWithSize计算内容宽度高度的问题

IOS BUG记录 boundingRectWithSize计算内容宽度高度的问题在IOS6和IOS7不同的系统出现的计算文本高度的方法不一样 IOS6中我们使用以下两个方法计算文本高度 (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(...
  • gloryFlow
  • gloryFlow
  • 2017-01-10 10:50
  • 1650

iOS方法:boundingRectWithSize:options:attributes:context:(计算文本尺寸)

原文:http://developer.apple.com/library/iOS/#documentation/uikit/reference/NSAttributedString_UIKit_Additions/RevisionHistory.html 概述 UIKit  在 NS...
  • LG_CodeMachine
  • LG_CodeMachine
  • 2016-06-04 19:59
  • 1915

iOS开发:boundingRectWithSize计算文字大小问题

UILabel有两个计算文字大小的方法: 1.针对对富文本计算NSAttributedString - (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(nul...
  • jijiji000111
  • jijiji000111
  • 2016-10-15 15:34
  • 1462
    个人资料
    • 访问:8855次
    • 积分:186
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类