iOS 实现label的超文本链接,点击不同文字

1.今天做到一个界面,包含不同协议,要求可点击,但是是一段话。之前做的项目都是只包含一个协议,可以直接给lable或者button设置手势或者点击事件,但是包含多个协议且是一段话的时候就要用到label的富文本及超文本。

在这里,有三种思路:

第一种,自己封装的多变的label类,这个网络上好多封装好的demo,但是比较复杂。我暂时先不用这个,需求简单,并且就一个地方用到。所以想另辟蹊径。可以几个推荐的链接:https://www.jianshu.com/p/d04bf1fa6fee
https://www.jianshu.com/p/1d00a2c9dfd8

第二种,利用textview。我采用的这种。上代码

#import "ViewController.h"



@interface ViewController () <UITextViewDelegate>



@end



@implementation ViewController



- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    NSString *str1 = @"大美女";

    NSString *str2 = @"爱上了英俊的";

    NSString *str3 = @"xtayqria";

    NSString *str = [NSString stringWithFormat:@"%@%@%@",str1,str2,str3];

    

    NSRange range1 = [str rangeOfString:str1];

    NSRange range2 = [str rangeOfString:str2];

    NSRange range3 = [str rangeOfString:str3];

    

    UITextView *textView = [[UITextView alloc] init];

    textView.frame = CGRectMake(40, 100, 300, 50);

    textView.editable = NO;

    textView.delegate = self;

    [self.view addSubview:textView];

    

    NSMutableAttributedString *mastring = [[NSMutableAttributedString alloc] initWithString:str attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:22.0f]}];

    [mastring addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:range1];

    [mastring addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:range2];

    [mastring addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:range3];



    // 1.必须要用前缀(firstPerson,secondPerson),随便写但是要有

    // 2.要有后面的方法,如果含有中文,url会无效,所以转码

    NSString *valueString1 = [[NSString stringWithFormat:@"firstPerson://%@",str1] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];

    NSString *valueString3 = [[NSString stringWithFormat:@"secondPerson://%@",str3] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];

    

    [mastring addAttribute:NSLinkAttributeName value:valueString1 range:range1];

    [mastring addAttribute:NSLinkAttributeName value:valueString3 range:range3];

    

    textView.attributedText = mastring;

}



- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {

    if ([[URL scheme] isEqualToString:@"firstPerson"]) {

        NSString *titleString = [NSString stringWithFormat:@"你点击了第一个文字:%@",[URL host]];

        [self clickLinkTitle:titleString];

        return NO;

    } else if ([[URL scheme] isEqualToString:@"secondPerson"]) {

        NSString *titleString = [NSString stringWithFormat:@"你点击了第二个文字:%@",[URL host]];

        [self clickLinkTitle:titleString];

        return NO;

    }

    return YES;

}



- (void)clickLinkTitle:(NSString *)title {

    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:title preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction *action = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleCancel handler:nil];

    [alert addAction:action];

    [self presentViewController:alert animated:YES completion:nil];

}

textview的代理事件,可以支持超文本链接哒,好方便。在需要的地方处理自己的逻辑即可。

第三种:利用YYText库把,非常方便。

NSMutableParagraphStyle *paragraphStyle  = [[NSMutableParagraphStyle alloc] init];
NSString *str0 = @"";
NSString *str1 = @"链接";
NSString *str = [NSString stringWithFormat:@"%@%@", str0, str1];
NSRange range0 = [str rangeOfString:str0];
NSRange range1 = [str rangeOfString:str1];
NSMutableAttributedString *attri_str = [[NSMutableAttributedString alloc] initWithString:str];
attri_str.yy_alignment = NSTextAligmentLeft;
attri_str.yy_paragraphStyle = paragraphStyle;
[attri_str yy_setFont:[UIFont fontWithName:@"" size:14] range:range0];
[attri_str yy_setColor:UIColorHex(0x333333) range:rang0];
....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值