自定义简单的iOS富文本解析模型

工作开发中经常遇到需要处理一些简单的富文本,比如要将一句话中的某些关键字加粗,例如:“My favorite fruite is Apple!”

这个问题本身不难解决,但是由于我们所有的 string 都需要做 localization,这就给工作增加了难度。于是我们提出一个简单的富文本解析模型,用于解决绝大多数的简单富文本需求。

我们的方案是将需要特殊格式的字段标记上自定义的 tag,通过 tag 解析来处理富文本,这样也解决了 localization 的问题。实现起来很简单,有兴趣的可以看下源码

例如需要实现 “My favorite fruite is Apple!”,只需要几行代码

NSString *localizableStr = @"My favorite fruite is <b>Apple</b>!";  
JCRichTextTag *tag = [[JCRichTextTag alloc] initWithStartTag:@"<b>" endTag:@"</b>" attributes:@{NSFontAttributeName: [UIFont boldSystemFontOfSize:17.0]}]; // 定义字体的时候需要提供字体大小  
JCRichTextParser *customizedParser = [[JCRichTextParser alloc] initWithTags:@[tag]];  
NSAttributedString *richText = [customizedParser parseWithText: localizableStr];// 将得到的 richText 赋值给 label 的 attributedText  

可以自定义更多的 tag 来得到更加复杂的富文本

NSString *localizableStr = @"A <italic_green>italic green</italic_green> and <large_bold>large bold</large_bold> <u>underline</u> text";  
JCRichTextTag *tag1 = [[JCRichTextTag alloc] initWithStartTag:@"<italic_green>" endTag:@"</italic_green>" attributes:@{NSFontAttributeName: [UIFont italicSystemFontOfSize:17.0], NSForegroundColorAttributeName: [UIColor greenColor]}];  
JCRichTextTag *tag2 = [[JCRichTextTag alloc] initWithStartTag:@"<large_bold>" endTag:@"</large_bold>" attributes:@{NSFontAttributeName: [UIFont boldSystemFontOfSize:34.0]}];  
JCRichTextTag *tag3 = [[JCRichTextTag alloc] initWithStartTag:@"<u>" endTag:@"</u>" attributes:@{NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)}];  
JCRichTextParser *customizedParser = [[JCRichTextParser alloc] initWithTags:@[tag1, tag2, tag3]];  
NSAttributedString *richText = [customizedParser parseWithText: localizableStr];  

通过以上代码可以得到如下样式的富文本 richTextDemo

如果项目中某几种样式使用频率比较高,可以将这几种样式定义成 defaultParser,通过一行代码即可得到默认的 parser,使用起来更方便,代码也更加整洁,具体可参考源码中的 Demo

JCRichTextParser *defaultParser = [JCRichTextParser defaultParserWithFontSize:17.0];