IOS开发入门iOS--富文本
白羽 2019-07-10 来源 :网络 阅读 434 评论 0

摘要:本文将带你了解IOS开发入门iOS--富文本,希望本文对大家学IOS有所帮助。

    本文将带你了解IOS开发入门iOS--富文本,希望本文对大家学IOS有所帮助。

IOS开发入门iOS--富文本

文章内容大纲
   
   
   1、NSMutableAttributedString的基本使用
   2、NSMutableAttributedString的简易封装
   3、使用开源代码GOBMarkupPaser处理富文本
   4、UITextKit简介
   5、编程思想的相关思考
   
   前言
   富文本使用案例:
   
   这里我自己也用了富文本实现了简单的却也是常用的例子:
   对于最后面的¥50中划线这种设置,估计只有富文本最好用了。
    
   在IOS或者Mac OS X通过UIKit提供的用来显示字符串控件有三个:
   UILable,UITextField,UITextView。
   然而这些控件本身对文本的展现方式很单一,通常仅仅能够控制字体样式、大小、颜色、加粗、斜体等等,而对于行距控制,字距控制,段落控制等高级功能却无能为力。
   此时不免要提起一个非常强大的文本排版框架CoreText.framework。
   CoreText框架是基于 iOS 3.2+ 和 OSX 10.5+ 的一种能够对文本格式和文本布局进行精细控制的文本引擎。它良好的结合了 UIKit  和 Core Graphics/Quartz:
   UIKit 的 UILabel 允许你通过在 IB 中简单的拖曳添加文本,但你不能改变文本的颜色和其中的单词。
   Core Graphics/Quartz几乎允许你做任何系统允许的事情,但你需要为每个字形计算位置,并画在屏幕上。
   CoreText正结合了这两者!你自己可以完全控制位置、布局、类似文本大小和颜色这样的属性,CoreText将帮你完善其它的东西??类似文本换行、字体呈现等等。
   然而,CoreText.framework本身非常庞大,学习成本较高,使用起来也不是很方便,所以一般不是特殊需要,很少会有人去使用它。
   随 着iOS6 API的发布,文字显示的API越来越完善,其中一个重要的更新是在UITextField,UITextView和UILabel中加入了对  AttributedString的支持,实现行距控制,字距控制,段落控制等高级功能也不必再去使用深奥的CoreText框架。
   而iOS7的发布,苹果又引入了TextKit,TextKit是一个快速而又现代化的文字排版和渲染引擎。
   TextKit并没有新增类,只是在原有的文本显示控件上进行了封装,可以在平时我们最喜欢使用的UILabel,UITextField,UITextView等控件里面使用,其最主要的作用就是为程序提供文字排版和渲染的功能。
   苹 果引入TextKit的目的并非要取代已有的CoreText框架,虽然CoreText的主要作用也是用于文字的排版和渲染,但它是一种先进而又处于底  层技术,如果我们需要将文本内容直接渲染到图形上下文(Graphics  context)时,从性能和易用性来考虑,最佳方案就是使用CoreText。而如果我们需要直接利用苹果提供的一些控件(如UITextView、  UILabel和UITextField等)对文字进行排版,那么借助于UIKit中TextKit提供的API无疑更为方便快捷。
   TextKit在文字处理方面具有非常强大的功能,并且开发者可以对TextKit进行定制和扩展。据悉,苹果利用了2年的时间来开发TextKit,相信这对许多开发者来说都是福音。
   
    
   IOS之NSMutableAttributedString 使用详解
   1、NSMutableAttributedString的基本使用
   富文本注意:
   先设置的先显示,后设置的,如果和先设置的样式不一致,是会覆盖的,富文本的设置具有先后顺序。
   不要忽略了空格也是一个字符。
   建议使用灵活的好用的NSMutableAttributedString,不要使用NSAttributedString。
   富文本基本使用方法的思路概要
   ?1234567891、创建一个NSMutableAttributedString富文本对象(一般不用NSAttributedString)2、设置addAttribute属性    (1)  addAttribute: 一个属性    (2) addAttributes:  一个存储多个属性的属性字典,比如这个字典可以是:        NSDictionary  *attrDic = @{                  NSFontAttributeName:  [UIFont fontWithName: @"Zapfino" size:  15],                                                NSForegroundColorAttributeName:  [UIColor blueColor]         };  3、控件.attributedText = 富文本对象(和控件.txt = NSString文本对象不一样的)
   示例富文本使用过程:
   
    
   其中AttributedString究竟可以设置哪些属性,具体来说,有以下21个:
   ?123456789101112131415161718192021NSFontAttributeName                 设置字体属性,默认值:字体:Helvetica(Neue) 字号:12NSForegroundColorAttributeNam       设置字体颜色,取值为  UIColor对象,默认值为黑色NSBackgroundColorAttributeName      设置字体所在区域背景颜色,取值为 UIColor对象,默认值为nil,  透明色NSLigatureAttributeName             设置连体属性,取值为NSNumber 对象(整数),0 表示没有连体字符,1  表示使用默认的连体字符NSKernAttributeName                 设定字符间距,取值为 NSNumber  对象(整数),正值间距加宽,负值间距变窄NSStrikethroughStyleAttributeName  设置删除线,取值为  NSNumber 对象(整数)NSStrikethroughColorAttributeName  设置删除线颜色,取值为 UIColor  对象,默认值为黑色NSUnderlineStyleAttributeName       设置下划线,取值为 NSNumber 对象(整数),枚举常量  NSUnderlineStyle中的值,与删除线类似NSUnderlineColorAttributeName       设置下划线颜色,取值为 UIColor  对象,默认值为黑色NSStrokeWidthAttributeName          设置笔画宽度,取值为 NSNumber  对象(整数),负值填充效果,正值中空效果NSStrokeColorAttributeName          填充部分颜色,不是字体颜色,取值为 UIColor  对象NSShadowAttributeName               设置阴影属性,取值为 NSShadow  对象NSTextEffectAttributeName           设置文本特殊效果,取值为 NSString 对象,目前只有图版印刷效果可用:NSBaselineOffsetAttributeName       设置基线偏移值,取值为 NSNumber  (float),正值上偏,负值下偏NSObliquenessAttributeName          设置字形倾斜度,取值为 NSNumber  (float),正值右倾,负值左倾NSExpansionAttributeName            设置文本横向拉伸属性,取值为 NSNumber  (float),正值横向拉伸文本,负值横向压缩文本NSWritingDirectionAttributeName     设置文字书写方向,从左向右书写或者从右向左书写NSVerticalGlyphFormAttributeName    设置文字排版方向,取值为 NSNumber 对象(整数),0 表示横排文本,1 表示竖排文本NSLinkAttributeName                 设置链接属性,点击后调用浏览器打开指定URL地址NSAttachmentAttributeName           设置文本附件,取值为NSTextAttachment对象,常用于文字图片混排NSParagraphStyleAttributeName       设置文本段落排版格式,取值为 NSParagraphStyle 对象
   
   关于属性的具体如何使用,对于不熟悉的属性可以通过搜索引擎了解。
   还可以直接到UIKIt框架底层去查询:
   
   注意:是UIKit框架下的NSAttributedString.h,而不是Foundation框架下的NSAttributedString.h去查,Foundation框架下虽然有NSAttributedString.h,但是Foundation框架没有关于富文本所有的key,而且和UIKit完全不一样的工具类。
   2、NSMutableAttributedString的简易封装
   写出思路:
   ?123根据NSMutableAttributedString的基本使用,我们每次需要设置富文本,都需要创建NSMutableAttributedString并调用相同的add...方法。那么,就可以先创建一个类,并把这个add...方法抽离出来放进这个类中,类似MVC的抽离模型数据对象。这个类是属性模型对象,而不是数据模型对象哦。说法不一,但本质其实一样的。
   
   富文本封装源代码代码百度云(持续更新)下载链接://pan.baidu.com/s/1c04YC8o密码: 3i7e
    
   3、使用开源代码GOBMarkupPaser处理富文本
   首先,关于开源代码GOBMarkupPaser处理富文本有一个很好的学习博客://www.cnblogs.com/YouXianMing/p/4269213.html也是框架原开发者github博文的翻译。值得英语不好的学习。
   github描述的虽然比较多,但是用起来还是比较容易的。下面只要跑一下程序,源码中也有demo,先看看源码运行的程序效果:
   
   因为这个开源代码GONMarkupParser处理富文本比较方便,所以以后开发项目建议使用。
   百度云下载链接://pan.baidu.com/s/1qWnFgQw密码: m2pe
   4、UITextKit简介
   什么是UITextKit?
   TextKit是在iOS7中新出的,实现了对CoreText的封装,使用起来更加方便.
   虽然是新出的,但也不代表立马就能上手-_-!!,TextKit可以实现图文混排效果,很好用.
   实现的过程如下:
   storage --> layoutManager --> textContainer --> textView
   这.....显示一串文本就要做这么多的事情.....
   一下图中代码实例是实现 高亮某些文本:
   
    
   什么时候使用UITextKit?
   图文混排,但并不是什么时候要实现图文混排就要用这个,比如有的app凤凰新闻客户端就不是,但是可以使用UITextKit实现稍微简单的图文混搭的界面。
   只需要了解一下有UITextKit这么个东西,其实这个UITextKit可以用来实现一个简易的电子书阅读器。
    
   Bezier n. 贝齐尔;贝塞尔曲线 exclusion n. 拒绝,排除
    
   小项目实现电子书:BookTextView实例效果动态图:
   
   小项目实现电子书:BookTextView中的ViewController上的代码
   
   ?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162631  #import "ViewController.h" 2 #import  "ParagraphAttributes+Constructor.h" 3 #import  "ExclusionView.h" 4 #import  "BookTextView.h" 5 6 #define  Width                              [UIScreen mainScreen].bounds.size.width 7 #define   Height                             [UIScreen mainScreen].bounds.size.height 8 9 @interface  ViewController ()<uitextviewdelegate>1011 @property (strong, nonatomic)  BookTextView *bookView;1213 @end1415 @implementation ViewController1617 -  (void)viewDidLoad {18     [super  viewDidLoad];19    20    21      // 读取文本22     NSString *text = [NSString  stringWithContentsOfFile:[NSBundle.mainBundle  URLForResource:@"lorem"  withExtension:@"txt"].path23                                                 encoding:NSUTF8StringEncoding24                                                    error:nil];25    26    27      // 初始化bookView28      self.bookView                      = [[BookTextView alloc] initWithFrame:CGRectMake(10, 10, Width - 20, Height -  20)];29      self.bookView.textString           = text;30    31     //  设置段落样式32     self.bookView.paragraphAttributes =  [ParagraphAttributes  qingKeBengYue];33    34     //  设置富文本35     self.bookView.attributes           = @[[ConfigAttributedString foregroundColor:[[UIColor blackColor]  colorWithAlphaComponent:0.75f]36                                                                              range:NSMakeRange(0,  9)],37                                            [ConfigAttributedString font:[UIFont fontWithName:QingKeBengYue  size:22.f]38                                                                   range:NSMakeRange(0,  9)]];39    40     //  加载图片41     ExclusionView *exclusionView = [[ExclusionView  alloc] initWithFrame:CGRectMake(150.f, 195, 320,  150)];42     self.bookView.exclusionViews =  @[exclusionView];43     UIImageView  *imageView       = [[UIImageView alloc] initWithFrame:exclusionView.bounds];44      imageView.image               = [UIImage imageNamed:@"demo"];45      [exclusionView addSubview:imageView];46    47    48      // 构建view49     [self.bookView  buildWidgetView];50     [self.view  addSubview:self.bookView];51    52    53      // 延时0.01s执行54     [self  performSelector:@selector(event)55                 withObject:nil56                 afterDelay:0.01];57 }5859 - (void)event {60      [self.bookView moveToTextPercent:0.00];61 }6263  @end</uitextviewdelegate>
   
   项目下载链接://pan.baidu.com/s/1pJEfAhP密码: 2aj6
    
   
   5、编程思想的相关思考
      在使用了UIKit的BookTextView的实例中,因为用到了自定义View,然后需要在自定义View上显示富文本。由于富文本的设置可以由  多个不同的属性值,比如:字体大小,文本前景色,背景色等等,所以需要抽离出来新建一个属性-值模型对象,每个对象存储一种属性-值,然后在自定义  View中添加property的NSArray,用来存储和重写set方法加载传进来的属性-值模型对象,然后通过文本对象对应的还未设置属性可变富文  本对象add这些属性-值模型对象存储的值。当然这个BookTextView内部因为用到UIKit所以是通过NSTextStorage  *storage通过遍历方法add加载NSArray对象存储的属性-值。
     而在HYStringAttribute实例中,因为仅仅  需要直接将NSString对象对应的富文本对象设置属性,最后添加到Label等控件上显示,因为考虑到简易封装的需求,所以特地将所有的属性抽象成一 个需要协议约束的抽象类,然后由这个抽象类具体派生出具体的属性对象,比如Font对象,前景色对象,背景色对象.....这里只实现了三种,还有很多待  有时间按需求去拓展。具体使用的时候,需要通过类别拓展方法来方便使用:<1>一种是富文本类拓展出方法,这个方法实现通过参数传入的具体的  属性对象,然后加载这个对象,设置富文本属性。<2>一种是NSString类拓展出方法,这个方法直接将本身实例对象self通过富文本创  建和加载通过参数传入的具体的属性对象,然后返回设置好富文本属性的富文本对象。    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程