第一种方法
- (void)viewDidLoad {
[super viewDidLoad];
CGFloat WIDTH = [UIScreen mainScreen].bounds.size.width;
NSString *str = @"Some Text, blabla...哈哈啊哈哈哈哈呵《我是协议》呵《我是协议》额呵呵呵呵好的好的好的好的好的好的好的";
// 1. 创建一个"高亮"属性,当用户点击了高亮区域的文本时,"高亮"属性会替换掉原本的属性
YYTextBorder *border = [YYTextBorder borderWithFillColor:[UIColor yellowColor] cornerRadius:3];
YYTextHighlight *highlight = [YYTextHighlight highlightWithBackgroundColor:[UIColor redColor]];
[highlight setColor:[UIColor greenColor]];
[highlight setBackgroundBorder:border];
// highlight.tapAction = ^(UIView *containerView, NSAttributedString *text, NSRange range, CGRect rect) {
// NSLog(@"tap text range:...");
// // 你也可以把事件回调放到 YYLabel 和 YYTextView 来处理。
// };
// 1. 创建一个属性文本
NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:str];
text.yy_font = [UIFont boldSystemFontOfSize:30];
text.yy_color = [UIColor blueColor];
text.yy_lineSpacing = 10;
NSString *highlightStr = @"《我是协议》";
NSArray *array = [self rangeOfSubString:highlightStr inString:str];
for (NSInteger i = 0; i < array.count; i++) {
NSValue *value = array[i];
// 2. 把"高亮"属性设置到某个文本范围
[text yy_setTextHighlight:highlight range:value.rangeValue];
[text yy_setColor:[UIColor redColor] range:value.rangeValue];
}
// 3. 赋值到 YYLabel 或 YYTextView
YYLabel *label = [[YYLabel alloc] init];
label.numberOfLines = 0;
label.preferredMaxLayoutWidth = WIDTH-30;
label.attributedText = text;
[self.view addSubview:label];
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(15);
make.right.mas_equalTo(-15);
make.top.mas_equalTo(100);
}];
label.textTapAction = ^(UIView * _Nonnull containerView, NSAttributedString * _Nonnull text, NSRange range, CGRect rect) {
NSLog(@"textTapAction");
};
}
- 注意:YYText用masonry布局要想自适应高度就必须设置以下两点
label.numberOfLines = 0;
label.preferredMaxLayoutWidth = WIDTH-30;
第二种方法
- (void)viewDidLoad {
[super viewDidLoad];
CGFloat WIDTH = [UIScreen mainScreen].bounds.size.width;
NSString *str = @"Some Text, blabla...哈哈啊哈哈哈哈呵《我是协议》呵《我是协议》额呵呵呵呵好的好的好的好的好的好的好的";
// 1. 创建一个属性文本
NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:str];
NSString *highlightStr = @"《我是协议》";
NSArray *array = [self rangeOfSubString:highlightStr inString:str];
// 2. 为文本设置属性
text.yy_font = [UIFont boldSystemFontOfSize:30];
text.yy_color = [UIColor blueColor];
text.yy_lineSpacing = 10;
for (NSInteger i = 0; i < array.count; i++) {
NSValue *value = array[i];
// [text yy_setColor:[UIColor redColor] range:value.rangeValue];
[text yy_setTextHighlightRange:value.rangeValue
color:[UIColor redColor]
backgroundColor:[UIColor grayColor]
tapAction:^(UIView *containerView, NSAttributedString *text, NSRange range, CGRect rect){
NSLog(@"tap text range:...");
}];
}
// 3. 赋值到 YYLabel 或 YYTextView
YYLabel *label = [[YYLabel alloc] init];
label.numberOfLines = 0;
label.preferredMaxLayoutWidth = WIDTH-30;
label.attributedText = text;
[self.view addSubview:label];
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(15);
make.right.mas_equalTo(-15);
make.top.mas_equalTo(100);
}];
// label.textTapAction = ^(UIView * _Nonnull containerView, NSAttributedString * _Nonnull text, NSRange range, CGRect rect) {
// NSLog(@"点击了");
// };
}
- 获取一个字符在字符串中出现的所有位置 返回一个被NSValue包装的NSRange数组
//获取一个字符在字符串中出现的所有位置 返回一个被NSValue包装的NSRange数组
- (NSArray *)rangeOfSubString:(NSString *)subStr inString:(NSString *)string {
if (subStr == nil && [subStr isEqualToString:@""]) {
return nil;
}
NSMutableArray *rangeArray = [NSMutableArray array];
NSString *string1 = [string stringByAppendingString:subStr];
NSString *temp;
for (int i = 0; i < string.length; i ++) {
temp = [string1 substringWithRange:NSMakeRange(i, subStr.length)];
if ([temp isEqualToString:subStr]) {
NSRange range = {i,subStr.length};
[rangeArray addObject:[NSValue valueWithRange:range]];
}
}
return rangeArray;
}