在改项目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
width:(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));
}

这样就可以不仅仅局限于字体和颜色了。

当然还可以扩展到,不同的关键字有不同的颜色、样式等。记录下思路,把关键字、字体样式等作为一个对象放入数组中。



iOS中动态计算不同颜色、字体的文字高度的更多相关文章

  1. iOS中动态注入JavaScript方法。动态给html标签添加事件

    项目中有这样一种需求,给html5网页中图片添加点击事件,并且弹出弹出点击的对应的图片,并且可以保持图片到本地 应对这样的需求你可能会想到很多方法来实现. 1. 最简单的方法就是在html5中添加图片 ...

  2. ios 中倒计时计算,时间戳为NaN

    // 倒计时 daojishi(params) { let _this = this; let datetemp = this.servertimes; let lasttime = Date.par ...

  3. iOS之动态计算文字的高度

    + (CGSize)boundingALLRectWithSize:(NSString *)txt Font:(UIFont *)font Size:(CGSize)size { NSMutableA ...

  4. IOS7中动态计算UILable的高度

    .h文件 #import <UIKit/UIKit.h> @interface UILabel (ContentSize) - (CGSize)contentSize; @end .m文件 ...

  5. iOS中 动态热修补技术JSPatch 韩俊强的博客

    .1.4) JSPatch bridge Objective-C and JavaScript. You can call any Objective-C class and method in Ja ...

  6. Android中动态更新TextView上的文字

    示例代码: 1.新线程,定时更新文字 class testThread extends Thread{ public void run() { Message message = new Messag ...

  7. iOS中 语音识别功能/语音转文字教程具体解释 韩俊强的博客

    原文地址:http://blog.csdn.net/qq_31810357/article/details/51111702 前言:近期研究了一下语音识别,从百度语音识别到讯飞语音识别:首先说一下个人 ...

  8. iOS中 语音识别功能/语音转文字教程详解 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 原文地址:http://blog.csdn.net/qq_31810357/article/details/5111 ...

  9. iOS中 动态启动图GIF的简单设置 韩俊强的博客

    // 设定位置和大小 CGRect frame = CGRectMake(50,340,[UIScreen mainScreen].bounds.size.width / 2,[UIScreen ma ...

随机推荐

  1. React Native实现一个自定义模块

    概述 在 前期介绍React Native 项目结构的时候,我们讲解过React的项目组成,其中说过 node_modules 文件夹,这是一个存放 node 模块的地方.我们知道React是用npm ...

  2. Android 在 SElinux下 如何获得对一个内核节点的访问权限

    点击打开链接 Android 5.0下,因为采取了SEAndroid/SElinux的安全机制,即使拥有root权限,或者对某内核节点设置为777的权限,仍然无法在JNI层访问. 本文将以用户自定义的 ...

  3. sybase isql命令参数详解

    isql 实用工具使您得以输入 Transact-SQL 语句.系统过程和脚本文件. 语法 isql [-?] | [-L] | [ { {-U login_id [-P password]} | - ...

  4. Eclipse中设置VM参数

    eclipse.ini -Xms256m //设置堆最小值 -Xmx1024m //设置堆最大值 Eclipse 做JVM 的分析时,需要动态设置JVM的参数来进行各种测试, 可以在下图地方进行设置 ...

  5. FFmpeg源代码简单分析:结构体成员管理系统-AVOption

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  6. scala for spark

    写了点scala的内容,方便看spark源码,估计一两天就能看完,内容比较粗浅. 下载地址: http://download.csdn.net/detail/lsshlsw/7983541

  7. 最简单的基于FFmpeg的内存读写的例子:内存播放器

    ===================================================== 最简单的基于FFmpeg的内存读写的例子系列文章列表: 最简单的基于FFmpeg的内存读写的 ...

  8. 【嵌入式开发】嵌入式 开发环境 (远程登录 | 文件共享 | NFS TFTP 服务器 | 串口连接 | Win8.1 + RedHat Enterprise 6.3 + Vmware11)

    作者 : 万境绝尘 博客地址 : http://blog.csdn.net/shulianghan/article/details/42254237 一. 相关工具下载 嵌入式开发工具包 : -- 下 ...

  9. Unity 简易的UI背景昼夜轮替效果

    在UI背景上实现一个简易的有光影照射的昼夜轮替效果,往往比一个死板的UI背景看起来更加形象生动,比较传统的方式是多图轮流替换的序列帧动画,不过要达到整个UI背景大图的所有地方都产生光影效果,那么务必每 ...

  10. ROS_Kinetic_01 在ubuntu 16.04安装ROS Kinetic 2017.01更新

    ROS_Kinetic系列学习(一),在ubuntu 16.04安装ROS Kinetic. Celebrating 9 Years of ROS! ubuntu16.04已经发布半年多了,ROS的K ...