iOS-YYText实现高亮效果

2020-07-13  本文已影响0人  HCL黄

传送门:YYKit

第一种方法

- (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");
    };
}
    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数组
- (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;
}
上一篇 下一篇

猜你喜欢

热点阅读