運用NSMutableAttributedString實現UILanel協議類點選事件
#import "ViewController.h"
#import "YJLAttributesLabel.h"
@interface ViewController ()
@end
@implementation ViewController
#pragma mark 多個點選位置進行簡單設定
-(NSMutableAttributedString *)textArr:(NSMutableArray *)textarr AttributedString:(NSMutableAttributedString *)String Connet:(NSString *)connet{
for (int i=0; i<textarr.count; i++) {
NSRange range = [connet rangeOfString:textarr[I]];
[String addAttribute:NSLinkAttributeName
value:textarr[I]
range: range];
}
return String;
}
- (void)viewDidLoad {
[super viewDidLoad];
YJLAttributesLabel *attributesLabel = [[YJLAttributesLabel alloc]initWithFrame:CGRectMake(10, 200, [UIScreen mainScreen].bounds.size.width - 20, 100)];
NSString *temp = @"我已經閱讀並同意註冊協議隱私協議,一旦退役就不能再次進行參與該活動了啊註冊政策";//全部顯示的文字
NSMutableArray * arr_text = [[NSMutableArray alloc]initWithObjects:@"註冊協議",@"隱私協議",@"註冊政策", nil];//點選的文字設定
NSMutableArray * arr_range = [[NSMutableArray alloc]initWithObjects:@"8",@"12",@"35", nil];//點選的文字開始位置設定
NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:temp];
attrStr = [self textArr:arr_text AttributedString:attrStr Connet:temp];//點選的文字簡單設定屬性
[attrStr addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:20]
range:NSMakeRange(0, attrStr.length)];
attributesLabel.YJLAttributesBlock = ^(NSString * _Nonnull clicktext) {//點選事件的d返回
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"提示" message:clicktext delegate:nil cancelButtonTitle:nil otherButtonTitles:@"我知道了", nil];
[alertView show];
};
[attributesLabel setAttributesText:attrStr actionText:arr_text actionRange:arr_range];//d新增到UILabel上面
[self.view addSubview:attributesLabel];
}
@end
YJLAttributesLabel 方法
YJLAttributesLabel.h
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface YJLAttributesLabel : UILabel
/**
@param text 傳入富文字型別的字串
@param actionText 要響應事件的字串
*/
- (void)setAttributesText: (NSMutableAttributedString *)text
actionText: (NSMutableArray *)actionText
actionRange:(NSMutableArray *)actionrange;
/**
點選事件回撥
*/
@property (nonatomic , copy) void(^YJLAttributesBlock)(NSString *clicktext);
@end
NS_ASSUME_NONNULL_END
YJLAttributesLabel.m
#import "YJLAttributesLabel.h"
@interface YJLTextView : UITextView
@end
@implementation YJLTextView
- (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];
}
- (BOOL)canBecomeFirstResponder {
return NO;
}
@end
@interface YJLAttributesLabel()<UITextViewDelegate>
@property (nonatomic , strong) YJLTextView *textView ;
@property (nonatomic , strong) NSMutableArray *actionText ;
@property (nonatomic , strong) NSMutableArray *actionRange ;
@end
@implementation YJLAttributesLabel
- (void)setAttributesText: (NSMutableAttributedString *)text actionText: (NSMutableArray *)actionText actionRange:(NSMutableArray *)actionrange{
self.textView.attributedText = text;
self.actionText = actionText;
self.actionRange = actionrange;
}
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction {
if ([self.actionRange containsObject:[NSString stringWithFormat:@"%ld",characterRange.location]]) {
NSLog(@"%ld",characterRange.location);
NSInteger index = [self.actionRange indexOfObject:[NSString stringWithFormat:@"%ld",characterRange.location]];
self.YJLAttributesBlock(self.actionText[index]);
return NO;
}
return YES;
}
- (instancetype)init {
if (self == [super init]) {
[self setupUI];
[self configuration];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame {
if (self == [super initWithFrame:frame]) {
[self setupUI];
[self configuration];
}
return self;
}
- (void)configuration {
self.userInteractionEnabled = YES;
}
- (void)setupUI {
[self addSubview:self.textView];
}
- (void)layoutSubviews {
self.textView.frame = self.bounds;
}
- (YJLTextView *)textView {
if (_textView == nil) {
_textView = [[YJLTextView alloc]init];
_textView.backgroundColor = self.backgroundColor;
_textView.textColor = self.textColor;
self.textColor = [UIColor clearColor];
_textView.font = self.font;
_textView.scrollEnabled = NO;
_textView.text = self.text;
_textView.delegate = self;
_textView.editable = NO;
_textView.textAlignment = self.textAlignment;
_textView.linkTextAttributes = @{NSForegroundColorAttributeName:[UIColor redColor]};
}
return _textView;
}
到此就實現了效果了