iOS中NSAttributedString的使用--对关键字着色,以及处理html实例
1,最近项目中用到了一个功能,一个很好的功能。就是用户在搜索的时候,搜索结果出来后对你输入的关键字进行红色标记。这样用户就很请楚的看到自己输入什么后会出现什么样子的结果。还有一个功能是,现在有一段文字了,但是要对其中的某些字符串进行着色处理,这个时候NSAttibutedString起到了非常大的作用。以下是我写好的一段代码,各位可以拿去用,非常方便的处理好。
#import <Foundation/Foundation.h> @interface NSAttributedString (Color)
/**
* 对内容中部份关键字进行着色处理
*
* @param content 所有内容
* @param searchs 关键字数组
*
* @return
*/
+(NSAttributedString *)attributeStringWithContent:(NSString *)content keyWords:(NSArray *)keyWords;
@end
+(NSAttributedString *)attributeStringWithContent:(NSString *)content keyWords:(NSArray *)keyWords
{
UIColor *color=[UIColor redColor];
NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:content];
if (keyWords) {
[keyWords enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSMutableString *tmpString=[NSMutableString stringWithString:content];
NSRange range=[content rangeOfString:obj];
NSInteger location=0;
while (range.length>0) {
[attString addAttribute:(NSString*)NSForegroundColorAttributeName value:color range:NSMakeRange(location+range.location, range.length)];
location+=(range.location+range.length);
NSString *tmp= [tmpString substringWithRange:NSMakeRange(range.location+range.length, content.length-location)];
tmpString=[NSMutableString stringWithString:tmp];
range=[tmp rangeOfString:obj];
}
}];
}
return attString;
}
之前也有看到类似的第三方,他是指写位置,哪个位置到哪个位置的,这里的话是直接指定字符串,而且,出现多次的,一样可以全部着色。大家可以根据自身需求进行细微的调整。
2,还有一种情况,当后台返回的内容中带有html独有的标签怎么办?当然,你可以选择一些第三方来处理,但是对比你想要的功能后,可以发现,这并不是你想要的,太笨重了,我只是要把html标签去了,或是就按html里面的格式显示 。但是又不想用webview去显示 ,因 为webview不能对这些文本进行编辑。这里我就简单写个把html转成NSAttibutedString的方法。
+(NSAttributedString *)attributedStringWithHtml:(NSString *)html
{
NSDictionary *options = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};
NSMutableAttributedString *attrString=[[NSMutableAttributedString alloc] initWithData:[html dataUsingEncoding:NSUnicodeStringEncoding allowLossyConversion:YES] options:options documentAttributes:nil error:nil];
return attrString; }
这里返回的是按照原来的html格式,CSS样式一样生效的。如果你只想把html标签去了,而不要显示成有CSS样式的,你可以直接在返回的attrString中再调用[attrString string]方法就可以,然后直接显示在label或者textView在,非常的方便。
3.这两天有朋友提到一个需求是,关键字和颜色都自定义,最后写了个方法实现了这个功能。
/**
* 对指定内定进行着色,keywords数组与colors数组相对应
*
* @param content 全部内容
* @param keyWords 关键字数组
* @param color 关键字对应颜色,如果传空,则默认对关键字着红色
* @param repeat 关键字出现多次的时候,是否全部进行多次着色,默认否
*
* @return
*/
+(NSAttributedString *)attributeStringWithContent:(NSString *)content keyWords:(NSArray *)keyWords colors:(NSArray *)colors repeat:(BOOL)repeat;
+(NSAttributedString *)attributeStringWithContent:(NSString *)content keyWords:(NSArray *)keyWords colors:(NSArray *)colors repeat:(BOOL)repeat
{ NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:content];
if (keyWords) { [keyWords enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSMutableString *tmpString=[NSMutableString stringWithString:content];
NSRange range=[content rangeOfString:obj];
NSInteger location=0;
while (range.length>0) {
UIColor *color=nil;
if (!colors[idx]) {
color=[UIColor redColor];
}else{
color=colors[idx];
}
[attString addAttribute:(NSString*)NSForegroundColorAttributeName value:color range:NSMakeRange(location+range.location, range.length)];
location+=(range.location+range.length);
NSString *tmp= [tmpString substringWithRange:NSMakeRange(range.location+range.length, content.length-location)];
tmpString=[NSMutableString stringWithString:tmp];
range=[tmp rangeOfString:obj];
if (!repeat) {
break;
}
} }];
} return attString; }
如果有什么问题可以向我反馈一下,谢谢
感觉大家阅读。
iOS中NSAttributedString的使用--对关键字着色,以及处理html实例的更多相关文章
- iOS中属性Property的常用关键字的使用说明
属性关键字的作用 现在我们iOS开发中,基本都是使用ARC(自动引用计数)技术,来编写我们的代码.因此在属性property中我们经常使用的关键字有strong,weak,assign,copy,no ...
- iOS中assign、copy 、retain等关键字的含义
iOS中assign.copy .retain等关键字的含义 转自:http://my.oschina.net/majiage/blog/267409 assign: 简单赋值,不更改索引计数cop ...
- iOS中常用属性的关键字的使用说明
属性关键字的作用 现在我们iOS开发中,基本都是使用ARC(自动引用计数)技术,来编写我们的代码.因此在属性property中我们经常使用的关键字有strong,weak,assign,copy,no ...
- iOS 中 const static extern 关键字总结
在看一些高手所写的代码时,总是可以看到我们小白平常不用的关键字,一次,两次,三次,不能总是不明不白,现在总结一下日常开发中常用的关键字的作用: 关键字const/static/extern的释义和用法 ...
- iOS中__block 关键字的底层实现原理
在 <iOS面试题集锦(附答案)> 中有这样一道题目: 在block内如何修改block外部变量?(38题)答案如下: 默认情况下,在block中访问的外部变量是复制过去的,即:写操作不对 ...
- 在iOS中如何正确的实现行间距与行高
最近准备给 VirtualView-iOS 的文本元素新增一个 lineHeight 属性,以便和 VirtualView-Android配合时能更精确的保证双平台的一致性.面向 Google 以及 ...
- iOS中数据库应用基础
iOS 数据库入门 一.数据库简介 1.什么是数据库? 数据库(Database) 是按照数据结构来组织,存储和管理数据的仓库 数据库可以分为2大种类 关系型数据库(主流) PC端 Oracle My ...
- 转iOS中delegate、protocol的关系
iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolc ...
- IOS中调用系统的电话、短信、邮件、浏览功能
iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 2015-01-13 09:16 by KenshinCui, 26990 阅读, 35 评 ...
随机推荐
- 三种解密 HTTPS 流量的方法介绍
转载自:https://imququ.com/post/how-to-decrypt-https.html作者: Jerry Qu Web 安全是一项系统工程,任何细微疏忽都可能导致整个安全壁垒土崩瓦 ...
- 蓝书2.2 KMP算法
T1 Radio Transmission bzoj 1355 题目大意: 一个字符串,它是由某个字符串不断自我连接形成的 但是这个字符串是不确定的,现在只想知道它的最短长度是多少 思路: kmp 输 ...
- 4.7.3 Canonical LR(1) Parsing Tables
4.7.3 Canonical LR(1) Parsing Tables We now give the rules for constructing the LR(1) ACTION and GOT ...
- Kconfig SourceCode GDB调试 *****
1.GDB&makefile scripts->Makefile编译FLAGS -g HOSTCC = gcc HOSTCXX = g++ HOSTCFLAGS := HOSTCXXF ...
- 杂项-Java:FreeMarker
ylbtech-杂项-Java:FreeMarker 1.返回顶部 1. FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源 ...
- Git-flow 一个简单高效的Git工作流
背景 由于Git的分支比SVN更好管理且更易使用,最近团队从SVN迁移到Git,需要重新规划开发流程,最终确定使用Git-flow工作流,这是目前比较流行的一种分支模型,下面是Git-flow的简易流 ...
- 一句powershell调用mimikatz抓密码
mimikatz神器大家都知道吧,可以抓取系统内的明文密码,但是平时我们测试的时候需要把mimikatz的几个文件上传到目标系统上面,然后再手工执行几个命令才能搞定,今天无意访问一个大神的博客,发现其 ...
- redis简介及常见问题
目录 简介 特点 优点 高性能 高并发 为什么要用 redis 而不用 map/guava 做缓存? redis 和 memcached 的区别 Redis快的原因 为什么redis是单线程 为什么r ...
- centos 扩展lrzsz通过xshell 下载安装文件
yum自动安装: yum install lrzsz 手动安装方法如下: 定制安装的linux可能没有把rzsz包安装到系统,这对用securecrt这样的windows工具传输文件特别不方便.为了使 ...
- spring 简单实现BeanFactory(转)
原文地址: http://blog.csdn.net/mlc1218559742/article/details/52776160 有没有发现上面的代码与利用反射实现工厂模式的代码很相似.对,你没有看 ...