iOS中动态计算不同颜色、字体的文字高度
在改项目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中动态计算不同颜色、字体的文字高度的更多相关文章
- iOS中动态注入JavaScript方法。动态给html标签添加事件
项目中有这样一种需求,给html5网页中图片添加点击事件,并且弹出弹出点击的对应的图片,并且可以保持图片到本地 应对这样的需求你可能会想到很多方法来实现. 1. 最简单的方法就是在html5中添加图片 ...
- ios 中倒计时计算,时间戳为NaN
// 倒计时 daojishi(params) { let _this = this; let datetemp = this.servertimes; let lasttime = Date.par ...
- iOS之动态计算文字的高度
+ (CGSize)boundingALLRectWithSize:(NSString *)txt Font:(UIFont *)font Size:(CGSize)size { NSMutableA ...
- IOS7中动态计算UILable的高度
.h文件 #import <UIKit/UIKit.h> @interface UILabel (ContentSize) - (CGSize)contentSize; @end .m文件 ...
- iOS中 动态热修补技术JSPatch 韩俊强的博客
.1.4) JSPatch bridge Objective-C and JavaScript. You can call any Objective-C class and method in Ja ...
- Android中动态更新TextView上的文字
示例代码: 1.新线程,定时更新文字 class testThread extends Thread{ public void run() { Message message = new Messag ...
- iOS中 语音识别功能/语音转文字教程具体解释 韩俊强的博客
原文地址:http://blog.csdn.net/qq_31810357/article/details/51111702 前言:近期研究了一下语音识别,从百度语音识别到讯飞语音识别:首先说一下个人 ...
- iOS中 语音识别功能/语音转文字教程详解 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博 原文地址:http://blog.csdn.net/qq_31810357/article/details/5111 ...
- iOS中 动态启动图GIF的简单设置 韩俊强的博客
// 设定位置和大小 CGRect frame = CGRectMake(50,340,[UIScreen mainScreen].bounds.size.width / 2,[UIScreen ma ...
随机推荐
- Android中ViewFlipper的使用详解
说到android的左右滑动效果我们可以说是在每个应用上面都可以看到这样的效果,不管是微博,还是QQ等. 实现左右滑动的方式很多,有ViewPager(不过这个和需要android-support-v ...
- SQL Server 索引维护(1)——如何获取索引使用情况
前言: 在前面一文中,已经提到了三类常见的索引问题,那么问题来了,当系统出现这些问题时,该如何应对? 简单而言,需要分析现有系统的行为,然后针对性地对索引进行处理: 对于索引不足的情况:检查缺少索引的 ...
- iOS编程Cookbook第19章最后一个例子不能正常工作的解决办法
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在Cookbook的第19章的11节中所要解决的是在App中显 ...
- iOS中 CocoaPods Mac App的安装和使用 韩俊强的博客
CocoaPods Mac App的安装和使用 CocoaPods桌面应用版下载地址:https://cocoapods.org/app打开应用会提示你是否安装命令行工具,选择install就也可以在 ...
- hbase操作(shell 命令,如建表,清空表,增删改查)以及 hbase表存储结构和原理
两篇讲的不错文章 http://www.cnblogs.com/nexiyi/p/hbase_shell.html http://blog.csdn.net/u010967382/article/de ...
- Android开发学习之路--RxAndroid之简单原理
学习了RxAndroid,其实也就是RxJava了,但是还是不是非常清楚到底RxAndroid有什么用呢?为什么要使用RxAndroid呢?这篇文章讲得不错,RxJava的原理.但是这里还是把整个 ...
- 【翻译】Ext JS 6.2 早期访问版本发布
原文:Announcing Ext JS 6.2 Early Access 非常开心,Sencha Ext JS 6.2早期访问版本今天发布了.早期访问版本的主要目的是为了让大家进行测试并评估Ext ...
- (一一〇)正则表达式的基本使用与RegexKitLite的使用
正则表达式常常用于匹配关键字,下面先介绍基本语法. [基本语法] ①中括号表示满足其中之一即可,例如[abc],则这个位置可以是a.b.c中任意一个. ②在中括号中,可以通过-连接范围,例如a-z:多 ...
- 03一些View总结
第三天 一 TextView 父类 : View >概念:文本控件 :文本内容的显示 默认配置不可编辑 子类EditText可以编辑 >属性: ...
- 【一天一道LeetCode】#118. Pascal's Triangle
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given n ...