iOS开发--从TQRichTextViewDemo中学会分析工程

 

 

1.首先找到AppDelegate类,无论一个工程有多么复杂,多么多的类,但入口只有一个就是AppDelegate类的didFinishLaunchingWithOptions方法。我们阅读别人源代码的时候可以从这里入手。在TQRichTextViewDemo工程中,这个方法中仅创建了一个TQViewController并设置为window的rootViewController。

 

2.去看TQViewController的实现。首先也是从初始化方法开始,没有initWithNib,那么就看viewDidLoad。在这个方法中,只创建了一个TQRichTextView,设置了frame,text,backgroundColor,delegate等属性,然后添加到了self.view上。看完viewDidLoad方法,发现这是系统调用的最后一个方法,那么结合模拟器的运行效果,我们可以猜测,文字的解析和绘制过程被封装到了TQRichTextView中。

 

3.去看TQRichTextView。

  • 继续阅读.m文件,发现drawRect方法,这个也是有系统调用的,那么绘制的工作应该是在这里完成。阅读drawRect方法。
  • 在drawRect中首先调用了analyzeText方法,传入了参数_text,并把返回值赋给了_textAnalyzed。
  • 去看analyzeText方法。首先清空了数组和字典,然后定义了一个NSString类型的result变量和NSMutableArray类型的array并赋值为richTextRunsArray。
  • 执行TQRichTextEmojiRun的一个方法,传入string和array的指针。
  • 执行TQRichTextURLRun的一个方法,传入result和array的指针。
  • 遍历richTextRunsArray中的对象,每个对象调用setOriginalFont方法,传入参数self.font。通过阅读上面的两个方法的内部实现明白richTextRunsArray中保存的是TQRichTextEmojiRun和TQRichTextURLRun对象,所以去看这两个对象的setOriginalFont方法。
  • 文本处理,遍历richTextRunsArray中的对象,每个对象调用replaceTextWithAttributedString方法。
  • 在TQRichTextEmojiRun没有找到replaceTextWithAttributedString方法,那就去TQRichTextImageRun中找,阅读该方法。
  • 同上阅读TQRichTextURLRun的replaceTextWithAttributedString方法。
  • 找重点,绘制替换过的特殊文本单元。
  • 调用drawRunWithRect方法,并将返回值赋给idDraw变量。
  • 如果响应触摸
  • 在richTextRunRectDic中添加键值对,key为rect,value为run。
  • 设置循环的条件,释放CF类型的变量。CF类型的变量不支持ARC。
  • 继续寻找TQRichTextView中重载系统的方法。返现touchesBegan和touchesEnd方法。阅读这两个方法。
  • 至此,整个TQRichTextViewDemo基本分析完毕。可得出如下结论。
  • 类的结构关系
  • 流程
  • 有以上可以得出结论,若要更换表情和文字的解析规则,则只需去TQRichTextEmojiRun或TQRichTextURLRun修改analyzeText:runsArray,replaceTextWithAttributedString,drawRunWithRect三个方法。
  • 由以上阅读代码发现如下缺陷
  • TQRichTextView的awakeFromNib方法没实现,如过使用xib拖拽,则无法为TQRichTextView添加默认属性。
  • 解决方法,添加awakeFromNib方法,并在其中为默认属性赋值。
  • sizeWithFont和boundingRectWithSize:options:attributes:context:方法计算时不会计算行间距,TQRichTextView的lineSpacing若不设置为0会导致两方法计算的高度比TQRichTextView实际显示需要的高度小。
  • 解决方法,TQRichTextView的lineSpacing设置为0。(责任编辑:幽灵学院)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值