在改项目bug的时候,有一个问题动态计算label的高度,前开发者竟然用字符串长度除以14、16这样的常量来计算是否换行,结果cell的高度问题非常严重。
因为label内容里有部分关键字是要另一种颜色,另一种字体,所以计算起来还是有一些难度的。找了多种解决方案,然后整理后写了一个工具方法来处理。
这其实可以扩展到字体的其他会影响到宽度的属性,因为项目里只考虑字体和颜色,所以先记录下来。
最新的方法是NSString的方法,在iOS 7之后才出现,我用的NSAttributedString方法,它是从iOS 6就有了,所以可以兼容到 iOS6 +。
直接上方法,这个方法可以写到一个工具类里或者给label、textView添加类别:
/** 计算文字的高度(正常字体一种字体和颜色,关键字另一种字体和颜色的情况),所有参数不能为空 */ + (CGFloat)getHeightWithText:(NSString *)text nomalFont:(UIFont *)nomalfont nomalColor:(UIColor *)nomalColor keyTextArray:(NSArray *)keyTextArray keyTextFont:(UIFont *)keyTextFont keyTextColor:(UIColor *)keyTextColor limitWidth:(CGFloat)width { //1、设置正常文字的字体和颜色 NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:text]; NSDictionary *nomalAttributes = @{NSFontAttributeName:nomalfont,NSForegroundColorAttributeName:nomalColor}; [attrStr addAttributes:nomalAttributes range:NSMakeRange(0, attrStr.length)]; //2、设置关键字的字体和颜色 for (NSString *keyText in keyTextArray) { //2.1、找出关键字的range NSRange range = [text rangeOfString:keyText]; if (range.length > 0) { //2.2、设置其颜色和字体 NSDictionary *keyAttributes = @{NSFontAttributeName:keyTextFont,NSForegroundColorAttributeName:keyTextColor}; [attrStr addAttributes:keyAttributes range:range]; } } //3、设置文字宽度以及模式 CGSize attrStrSize = [attrStr boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin context:nil].size; //4、得出高度 return attrStrSize.height; }因为参数太多了,然后为了便于扩展,又优化了一点点
/** 计算文字高度 方法二 */ - (void)getHeightWithText:(NSString *)text attributes:(NSDictionary *)attributes keyTextArray:(NSArray *)keyTextArray keyTextAttributes:(NSDictionary *)keyAttributes (CGFloat)width { //1、设置正常文字的字体和颜色 NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:text]; [attrStr addAttributes:attributes range:NSMakeRange(0, attrStr.length)]; //2、设置关键字的字体和颜色 for (NSString *keyText in keyTextArray) { //2.1、找出关键字的range NSRange range = [text rangeOfString:keyText]; if (range.length > 0) { //2.2、设置其颜色和字体 [attrStr addAttributes:keyAttributes range:range]; } } //3、设置文字宽度以及模式 CGSize attrStrSize = [attrStr boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin context:nil].size; //4、得出高度 NSLog(@"attrStrSize:%@",NSStringFromCGSize(attrStrSize)); }这样就可以不仅仅局限于字体和颜色了。
当然还可以扩展到,不同的关键字有不同的颜色、样式等。记录下思路,把关键字、字体样式等作为一个对象放入数组中。