簡單實現UILabel之協議類點選事件

weixin_34148340發表於2019-02-21

運用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;
}

到此就實現了效果了

1684093-02d06a76cff710d5.PNG
IMG_0792.PNG
1684093-d4633259ad693b07.PNG
IMG_0793.PNG

相關文章