在上一篇文章(一一一)图文混排基础 -利用正则分割和拼接属性字符串中提到了对attributedText的特殊处理,将其中的话题、URL都用红色进行了表示,如下图所示:
本节要实现的功能是这样的attributedText在点击话题、URL时应该有所响应,而在点击其他位置的时候把事件传递给父类处理。
要获取到点击的位置很简单,只需要重写touchesBegan方法即可拿到触摸点,比较棘手的是判断出触摸位置的文字的范围(CGRect),如果能拿到点击文字的rect,就能对rect进行高亮处理和事件处理。
把这个需求拆分,我们应该按照下面的步骤进行:
①在拼接attributedText的时候记录下所有特殊文字的位置和内容、保存到模型里,再把模型存入数组。
#import <Foundation/Foundation.h>
@interface TextSpecial : NSObject
@property (nonatomic, copy) NSString *text;
@property (nonatomic, assign) NSRange range;
@end
因为微博数据也是通过模型传递的,为微博模型定义属性来保存所有的模型,以便后续处理。
@property (nonatomic, strong) NSMutableArray *specialSegments;
在上节介绍的代码中,加入一段用于保存特殊文字的代码:
[self.specialSegments removeAllObjects];
NSInteger cnt = parts.count;
for (NSInteger i = 0; i < cnt; i++) {
TextSegment *ts = parts[i];
if (ts.isEmotion) {
NSTextAttachment *attach = [[NSTextAttachment alloc] init];
attach.image = [UIImage imageNamed:@"avatar_vgirl"];
attach.bounds = CGRectMake(0, -3, 15, 15);
NSAttributedString *emotionStr = [NSAttributedString attributedStringWithAttachment:attach];
[attributedText appendAttributedString:emotionStr];
}else if(ts.isSpecial){
NSAttributedString *special = [[NSAttributedString alloc] initWithString:ts.text att