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 ...
随机推荐
- maven配置详解
什么是pom? pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件:开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的 ...
- java虚拟机 jvm 局部变量表实战
java局部变量表是栈帧重要组中部分之一.他主要保存函数的参数以及局部的变量信息.局部变量表中的变量作用域是当前调用的函数.函数调用结束后,随着函数栈帧的销毁.局部变量表也会随之销毁,释放空间. 由于 ...
- 12 SharedPreferences
SharedPreferences 创建方式 SharedPreferences preferences = getPreferences(Context context ,int mode); 参数 ...
- SYBASE bcp用法及例子
BCP是SYBASE公司提供专门用于数据库表一级数据备份的工具. 语法: 语法如下:(可用 bcp – 得到) 常用参数说明: -b batch_size 指定所复制的每批数据中的行数.每个批处理作为 ...
- EBS财务模块表结构
gl_code_combinations:科目组合 字段名 含义 备注 code_combination_id 主键,科目编码ID,自动编号 segment1 分行代码 setgment2 是受 ...
- Sky(dart)语言介绍-android学习之旅(十)
认识dart语言 google于2011年10月10日发布了"dart"语言的"早起预览版",google希望利用这款语言,帮助开发者克服javaScript的 ...
- UNIX网络编程——TCP—经受时延与nagle算法、滑动窗口、拥塞窗口
1.经受时延: TCP在接收到数据时并不立即发送ACK,相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送,时延为200ms,超过时延范围,发送确认. 2.nagle算法: 一个TCP连接 ...
- FND Debug Log(FND_LOG_MESSAGES)
之前每个模块记录日志的方式都不同,都会把日志写到不同的文件中,对于User来说很麻烦,需要记住很多的配置,现在越来越多的模块使用FND Logging来存储日志,比如WIP,RCV,OAF...FND ...
- 精通CSS+DIV网页样式与布局--初探CSS
CSS英文名Cascading Style Sheet,中文名字叫层叠样式表,是用于控制页面样式并允许将样式信息与网页内容分离的一种标记性语言,DIV+CSS是WEB设计标准,它是一种网页的布局方法. ...
- Uva - 210 - Concurrency Simulator
自己写个双端队列,或者直接用deque,这个也比较好用 AC代码: #include <iostream> #include <cstdio> #include <cst ...