前言
總是會有“我已經(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一段時間沒有電腦,也沒法摸代碼球化。這波我把能改的問題都改了一下秽晚。