iOS UITextView 文字鏈接點(diǎn)擊事件

前言

總是會有“我已經(jīng)閱讀并同意了《各種協(xié)議》” 這樣的東西喊巍,一般都是高亮字體,點(diǎn)擊還能跳轉(zhuǎn)箍鼓。崭参。 我從來沒用過button去拼湊鏈接

代碼地址 https://github.com/gityuency/ObjectiveCTools
【類名:TextViewViewController】

效果圖:


文本鏈接.gif

上一次寫的這個文本框文字鏈接有些小問題,在長按款咖、點(diǎn)擊之后長按何暮、雙擊、等手勢操作的時候铐殃,UITextView會有選中的樣式出現(xiàn)海洼,這次把剛剛那些問題都修復(fù)了。

代碼:

第一步富腊,繼承UITextView坏逢,然后添加以下代碼:

我在控制臺里面打印出各種點(diǎn)擊操作之后,出現(xiàn)的手勢赘被,但是這些手勢貌似蘋果沒有提供出來給我們用是整,所以拿手勢的名字來做判斷,這招也還行帘腹,只是有iOS版本要求贰盗。
MyTextView.m


#import "MyTextView.h"

@implementation MyTextView

/// 重寫手勢響應(yīng)的方法
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    
    if (@available(iOS 11.0, *)) {
        
        //我們把需要的手勢啟用
        //其實(shí)我們只需要這個單選
        if ([gestureRecognizer.name isEqualToString:@"UITextInteractionNameSingleTap"]) {
            return YES;
        }
        //我們也需要這個鏈接點(diǎn)選
        if ([gestureRecognizer.name isEqualToString:@"UITextInteractionNameLinkTap"]) {
            return YES; //如果這里寫成 NO, 那么在點(diǎn)擊 TextView 上面自定義鏈接的時候, 就會失效
        }
        
        
        //我們把不需要的手勢都禁用掉
        //禁用雙擊
        if ([gestureRecognizer.name isEqualToString:@"UITextInteractionNameDoubleTap"]) {
            return NO;
        }
        //禁用先點(diǎn)按之后長按
        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: 方法后, 下面這個方法也可以不寫, 因?yàn)槭謩荼幌冉玫袅? 所以響應(yīng)事件就不會觸發(fā)
/// 禁用掉 選擇 多選 復(fù)制 剪切 粘貼 等各種東西
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    // 返回NO為禁用,YES為開啟
    // 粘貼
    if (action == @selector(paste:)) {
        return NO;
    }
    // 剪切
    if (action == @selector(cut:)) {
        return NO;
    }
    // 復(fù)制
    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; 這一句寫了點(diǎn)擊事件就失效
    
    NSString *aLink = @"《青米網(wǎng)絡(luò)科技無限公司隱私協(xié)議》";
    NSString *bLink = @"《青米網(wǎng)絡(luò)科技賣身協(xié)議》";
    NSString *link = [NSString stringWithFormat:@"我已經(jīng)同意并且認(rèn)真閱讀了遵守%@%@",aLink,bLink];
    
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithString:link];
    
    //設(shè)置鏈接文本
    [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]];
    
    //設(shè)置鏈接樣式
    self.tview.linkTextAttributes = @{
        NSForegroundColorAttributeName: [UIColor redColor],
        NSUnderlineColorAttributeName: [UIColor clearColor],
        NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)
    };
    
    self.tview.attributedText = attributedString;
    
    
    NSLog(@"各種手勢:\n %@", self.tview.gestureRecognizers);
}

#pragma mark - 實(shí)現(xiàn)鏈接代理
- (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

結(jié)語:

感謝各位給我寫的評論舵盈,因?yàn)槲液荛L一段時間沒有電腦,也沒法摸代碼球化。這波我把能改的問題都改了一下秽晚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市筒愚,隨后出現(xiàn)的幾起案子赴蝇,更是在濱河造成了極大的恐慌,老刑警劉巖巢掺,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件句伶,死亡現(xiàn)場離奇詭異,居然都是意外死亡陆淀,警方通過查閱死者的電腦和手機(jī)考余,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轧苫,“玉大人楚堤,你說我怎么就攤上這事。” “怎么了身冬?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵衅胀,是天一觀的道長。 經(jīng)常有香客問我酥筝,道長滚躯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任樱哼,我火速辦了婚禮哀九,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搅幅。我一直安慰自己阅束,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布茄唐。 她就那樣靜靜地躺著息裸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沪编。 梳的紋絲不亂的頭發(fā)上呼盆,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音蚁廓,去河邊找鬼访圃。 笑死,一個胖子當(dāng)著我的面吹牛相嵌,可吹牛的內(nèi)容都是我干的腿时。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饭宾,長吁一口氣:“原來是場噩夢啊……” “哼批糟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起看铆,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤徽鼎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后弹惦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體否淤,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年棠隐,在試婚紗的時候發(fā)現(xiàn)自己被綠了石抡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡宵荒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情报咳,我是刑警寧澤侠讯,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站暑刃,受9級特大地震影響厢漩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜岩臣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一溜嗜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧架谎,春花似錦炸宵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至会涎,卻和暖如春裹匙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背末秃。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工概页, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人练慕。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓惰匙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贺待。 傳聞我的和親對象是個殘疾皇子徽曲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評論 25 707
  • 文語,繁花雁比,慢慢稚虎。 我在百花齊放的春天慕你,在晝夜蟬鳴的長夏愛你偎捎,在銀杏紛飛的金秋念你蠢终,在雪染大地的冬季等你序攘。 你...
    語花慢閱讀 263評論 7 0
  • 每到秋風(fēng)來臨,露水成霜時寻拂,樹葉脫落了程奠,群花萎縮了,唯有菊花迎風(fēng)而立祭钉、傲霜怒放瞄沙、千姿百態(tài)。
    0434欣玥閱讀 232評論 0 4
  • “慈母手中線慌核,游子身上衣”每每聽到女兒唱這首歌距境,不由讓我想起我的母親。在生活中母親是多麼慈祥的一角色垮卓,我的...
    兮敏閱讀 228評論 0 0
  • 迷茫,是一個一直都很流行的詞钾怔。比如說起青春的時候碱呼,都會說起那時候的迷茫,好像不迷茫就沒有青春過一樣宗侦。青春過后愚臀,為了...
    如柏的日記閱讀 1,404評論 1 2