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

前言

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

代碼地址 https://github.com/gityuency/ObjectiveCTools
【類(lèi)名:TextViewViewController】

效果圖:


文本鏈接.gif

上一次寫(xiě)的這個(gè)文本框文字鏈接有些小問(wèn)題,在長(zhǎng)按、點(diǎn)擊之后長(zhǎng)按、雙擊、等手勢(shì)操作的時(shí)候,UITextView會(huì)有選中的樣式出現(xiàn),這次把剛剛那些問(wèn)題都修復(fù)了。

代碼:

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

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


#import "MyTextView.h"

@implementation MyTextView

/// 重寫(xiě)手勢(shì)響應(yīng)的方法
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    
    if (@available(iOS 11.0, *)) {
        
        //我們把需要的手勢(shì)啟用
        //其實(shí)我們只需要這個(gè)單選
        if ([gestureRecognizer.name isEqualToString:@"UITextInteractionNameSingleTap"]) {
            return YES;
        }
        //我們也需要這個(gè)鏈接點(diǎn)選
        if ([gestureRecognizer.name isEqualToString:@"UITextInteractionNameLinkTap"]) {
            return YES; //如果這里寫(xiě)成 NO, 那么在點(diǎn)擊 TextView 上面自定義鏈接的時(shí)候, 就會(huì)失效
        }
        
        
        //我們把不需要的手勢(shì)都禁用掉
        //禁用雙擊
        if ([gestureRecognizer.name isEqualToString:@"UITextInteractionNameDoubleTap"]) {
            return NO;
        }
        //禁用先點(diǎn)按之后長(zhǎng)按
        if ([gestureRecognizer.name isEqualToString:@"UITextInteractionNameTapAndAHalf"]) {
            return NO;
        }
        //禁用長(zhǎng)按 1
        if ([gestureRecognizer.name isEqualToString:@"_UIKeyboardTextSelectionGestureForcePress"]) {
            return NO;
        }
        //禁用長(zhǎng)按 2
        if ([gestureRecognizer.name isEqualToString:@"UITextInteractionNameInteractiveLoupe"]) {
            return NO;
        }
        
    } else {
        // Fallback on earlier versions
    }
    return YES;
}


/// 注: 在 我重寫(xiě)了 gestureRecognizerShouldBegin: 方法后, 下面這個(gè)方法也可以不寫(xiě), 因?yàn)槭謩?shì)被先禁用掉了, 所以響應(yīng)事件就不會(huì)觸發(fā)
/// 禁用掉 選擇 多選 復(fù)制 剪切 粘貼 等各種東西
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    // 返回NO為禁用,YES為開(kāi)啟
    // 粘貼
    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

第二步,寫(xiě)個(gè)控制器做測(cè)試用

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; 這一句寫(xiě)了點(diǎn)擊事件就失效
    
    NSString *aLink = @"《青米網(wǎng)絡(luò)科技無(wú)限公司隱私協(xié)議》";
    NSString *bLink = @"《青米網(wǎng)絡(luò)科技賣(mài)身協(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(@"各種手勢(shì):\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ǔ):

感謝各位給我寫(xiě)的評(píng)論,因?yàn)槲液荛L(zhǎng)一段時(shí)間沒(méi)有電腦,也沒(méi)法摸代碼。這波我把能改的問(wèn)題都改了一下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,057評(píng)論 25 709
  • 文語(yǔ),繁花,慢慢。 我在百花齊放的春天慕你,在晝夜蟬鳴的長(zhǎng)夏愛(ài)你,在銀杏紛飛的金秋念你,在雪染大地的冬季等你。 你...
    語(yǔ)花慢閱讀 314評(píng)論 7 0
  • 每到秋風(fēng)來(lái)臨,露水成霜時(shí),樹(shù)葉脫落了,群花萎縮了,唯有菊花迎風(fēng)而立、傲霜怒放、千姿百態(tài)。
    0434欣玥閱讀 256評(píng)論 0 4
  • “慈母手中線,游子身上衣”每每聽(tīng)到女兒唱這首歌,不由讓我想起我的母親。在生活中母親是多麼慈祥的一角色,我的...
    兮敏閱讀 253評(píng)論 0 0
  • 迷茫,是一個(gè)一直都很流行的詞。比如說(shuō)起青春的時(shí)候,都會(huì)說(shuō)起那時(shí)候的迷茫,好像不迷茫就沒(méi)有青春過(guò)一樣。青春過(guò)后,為了...
    如柏的日記閱讀 1,543評(píng)論 1 2

友情鏈接更多精彩內(nèi)容