前言
總是會(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)題都改了一下。