干货基础控件的封装

iOS 利用UITextView实现简单文字点击

2019-07-05  本文已影响1人  骑马纵天下

通过textView实现简单文字点击,实现方式很简单,通过textView可以响应识别URL来判断点击的文字。

@interface ViewController ()<UITextViewDelegate>

@property (nonatomic ,strong) HPResponseTextView *textView;
@property (nonatomic ,assign) NSString *content;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    _textView = [[HPResponseTextView alloc]initWithFrame:CGRectMake(0, 100, [UIScreen mainScreen].bounds.size.width, 300)];
//    _textView.backgroundColor = [UIColor redColor];
    _textView.textColor = [UIColor blackColor];
    _textView.editable = NO;//必须禁止输入,否则点击将会弹出输入键盘
    _textView.scrollEnabled = NO;//可选的,视具体情况而定
    _textView.text = @"阅读APP规则请点击同意,否则不允许注册!你所说的一切都将会是呈堂证供。这是个很简单的文字点击事件,只能实现文字点击至于图文混排建议使用Core Text,功能更强大。很多第三方都实现了如YYText里面的YYLabel";
    [self.view addSubview:_textView];
    NSArray *tempArray = @[@"点击同意",@"允许注册",@"呈堂证供",@"YYText",@"YYLabel",@"第三方",@"图文混排",@"Core Text"];
    [_textView responseTextWithClickStringArray:tempArray];
    _textView.font = [UIFont systemFontOfSize:16];
    _textView.textBlock = ^(NSString * _Nonnull text) {
        NSString *tempStr = [NSString stringWithFormat:@"你点击了  %@",text];
        UIAlertController *alc = [UIAlertController alertControllerWithTitle:@"" message:tempStr preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
            
        }];
        [alc addAction:cancel];
        [self presentViewController:alc animated:YES completion:nil];
    };

}

@end
.h

typedef void(^didTextBlock) (NSString *text);


@interface HPResponseTextView : UITextView <UITextViewDelegate>

@property (nonatomic ,copy) didTextBlock textBlock;

- (void)responseTextWithClickStringArray:(NSArray <NSString *>*)aStringArray;

@end

.m
@interface HPResponseTextView ()

@property (nonatomic ,strong) NSArray *stringArray;
@property (nonatomic ,strong) NSMutableArray *rangeMarray;
@end

@implementation HPResponseTextView

- (instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        self.delegate = self;
        _rangeMarray = @[].mutableCopy;
    }
    return self;
}


- (void)responseTextWithClickStringArray:(NSArray<NSString *> *)aStringArray{
    _stringArray = aStringArray;
    self.textColor = [UIColor redColor];
    NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc]initWithString:self.text];
    for (NSString *tempStr in aStringArray) {
        NSRange tempRange = [self.text rangeOfString:tempStr];
        [_rangeMarray addObject:NSStringFromRange(tempRange)];
        [attributedStr addAttribute:NSLinkAttributeName value:tempStr range:tempRange];
        [attributedStr addAttribute:NSFontAttributeName value: [UIFont systemFontOfSize:16] range:tempRange];
        [attributedStr addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:tempRange];
    }
    self.attributedText = attributedStr;
}

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction{
    NSString *tempRangeStr = NSStringFromRange(characterRange);
    if ([_rangeMarray containsObject:tempRangeStr]) {
        NSString *selectStr = [self.text substringWithRange:characterRange];
        NSLog(@"%@",selectStr);
        if (self.textBlock) {
            self.textBlock(selectStr);
        }
    }
    return YES;
}



@end

效果 效果
上一篇 下一篇

猜你喜欢

热点阅读