iOS UITextView 文字链接点击事件

前言

总是会有“我已经阅读并同意了《各种协议》” 这样的东西,一般都是高亮字体,点击还能跳转。。 我从来没用过button去拼凑链接

代码地址 https://github.com/gityuency/ObjectiveCTools
【类名:TextViewViewController】

效果图:


文本链接.gif

上一次写的这个文本框文字链接有些小问题,在长按、点击之后长按、双击、等手势操作的时候,UITextView会有选中的样式出现,这次把刚刚那些问题都修复了。

代码:

第一步,继承UITextView,然后添加以下代码:

我在控制台里面打印出各种点击操作之后,出现的手势,但是这些手势貌似苹果没有提供出来给我们用,所以拿手势的名字来做判断,这招也还行,只是有iOS版本要求。
MyTextView.m


#import "MyTextView.h"

@implementation MyTextView

/// 重写手势响应的方法
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    
    if (@available(iOS 11.0, *)) {
        
        //我们把需要的手势启用
        //其实我们只需要这个单选
        if ([gestureRecognizer.name isEqualToString:@"UITextInteractionNameSingleTap"]) {
            return YES;
        }
        //我们也需要这个链接点选
        if ([gestureRecognizer.name isEqualToString:@"UITextInteractionNameLinkTap"]) {
            return YES; //如果这里写成 NO, 那么在点击 TextView 上面自定义链接的时候, 就会失效
        }
        
        
        //我们把不需要的手势都禁用掉
        //禁用双击
        if ([gestureRecognizer.name isEqualToString:@"UITextInteractionNameDoubleTap"]) {
            return NO;
        }
        //禁用先点按之后长按
        if ([gestureRecognizer.name isEqualToString:@"UITextInteractionNameTapAndAHalf"]) {
            return NO;
        }
        //禁用长按 1
        if ([gestureRecognizer.name isEqualToString:@"_UIKeyboardTextSelectionGestureForcePress"]) {
            return NO;
        }
        //禁用长按 2
        if ([gestureRecognizer.name isEqualToString:@"UITextInteractionNameInteractiveLoupe"]) {
            return NO;
        }
        
    } else {
        // Fallback on earlier versions
    }
    return YES;
}


/// 注: 在 我重写了 gestureRecognizerShouldBegin: 方法后, 下面这个方法也可以不写, 因为手势被先禁用掉了, 所以响应事件就不会触发
/// 禁用掉 选择 多选 复制 剪切 粘贴 等各种东西
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    // 返回NO为禁用,YES为开启
    // 粘贴
    if (action == @selector(paste:)) {
        return NO;
    }
    // 剪切
    if (action == @selector(cut:)) {
        return NO;
    }
    // 复制
    if (action == @selector(copy:)) {
        return NO;
    }
    // 选择
    if (action == @selector(select:)) {
        return NO;
    }
    // 选中全部
    if (action == @selector(selectAll:)) {
        return NO;
    }
    // 删除
    if (action == @selector(delete:)) {
        return NO;
    }
    // 分享
    if (action == @selector(share)) {
        return NO;
    }
    return [super canPerformAction:action withSender:sender];
}

@end

第二步,写个控制器做测试用

TextViewViewController.m

#import "TextViewViewController.h"
#import "MyTextView.h"

@interface TextViewViewController () <UITextViewDelegate>

@property (nonatomic, strong) MyTextView *tview;

@end

@implementation TextViewViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = UIColor.whiteColor;
    
    self.tview = [[MyTextView alloc] initWithFrame:CGRectMake(20, 150, [UIScreen mainScreen].bounds.size.width - 40, 300)];
    self.tview.backgroundColor = [[UIColor orangeColor] colorWithAlphaComponent:0.5];
    [self.view addSubview:self.tview];
    
    self.tview.delegate = self;
    self.tview.editable = NO;
    self.tview.scrollEnabled = NO;
    //self.vvv.selectable = NO; 这一句写了点击事件就失效
    
    NSString *aLink = @"《青米网络科技无限公司隐私协议》";
    NSString *bLink = @"《青米网络科技卖身协议》";
    NSString *link = [NSString stringWithFormat:@"我已经同意并且认真阅读了遵守%@%@",aLink,bLink];
    
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithString:link];
    
    //设置链接文本
    [attributedString addAttribute:NSLinkAttributeName
                             value:@"http://www.baidu.com"
                             range:[[attributedString string] rangeOfString:aLink]];
    
    [attributedString addAttribute:NSLinkAttributeName
                             value:@"http://www.163.com"
                             range:[[attributedString string] rangeOfString:bLink]];
    
    [attributedString addAttribute:NSFontAttributeName
                             value:[UIFont systemFontOfSize:24]
                             range:[[attributedString string] rangeOfString:link]];
    
    //设置链接样式
    self.tview.linkTextAttributes = @{
        NSForegroundColorAttributeName: [UIColor redColor],
        NSUnderlineColorAttributeName: [UIColor clearColor],
        NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)
    };
    
    self.tview.attributedText = attributedString;
    
    
    NSLog(@"各种手势:\n %@", self.tview.gestureRecognizers);
}

#pragma mark - 实现链接代理
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
    NSLog(@"可以判断一下链接, %@",URL);
    return YES;
}

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction  API_AVAILABLE(ios(10.0)){
    NSLog(@"iOS 10+ %@",URL);
    return YES;
}

@end

结语:

感谢各位给我写的评论,因为我很长一段时间没有电脑,也没法摸代码。这波我把能改的问题都改了一下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,566评论 25 707
  • 文语,繁花,慢慢。 我在百花齐放的春天慕你,在昼夜蝉鸣的长夏爱你,在银杏纷飞的金秋念你,在雪染大地的冬季等你。 你...
    语花慢阅读 240评论 7 0
  • 每到秋风来临,露水成霜时,树叶脱落了,群花萎缩了,唯有菊花迎风而立、傲霜怒放、千姿百态。
    0434欣玥阅读 224评论 0 4
  • “慈母手中線,游子身上衣”每每聽到女兒唱這首歌,不由讓我想起我的母親。在生活中母親是多麽慈祥的一角色,我的...
    兮敏阅读 214评论 0 0
  • 迷茫,是一个一直都很流行的词。比如说起青春的时候,都会说起那时候的迷茫,好像不迷茫就没有青春过一样。青春过后,为了...
    如柏的日记阅读 1,329评论 1 2