UILabel点击调用电话以及邮箱,UILabel超链接效果 NSMutableAttributedString文本样式设置

UILabel常用功能
首先感谢WYWebController的作者,感谢那些拥有共享精神的程序员,谢谢!!!

LinkLabel是我继承UILabel的.h

#import <UIKit/UIKit.h>
typedef enum{
    TEL_TYPE,
    EMAIL_TYPE,
    LINK_TYPE
}TextType;

typedef void(^TapLinkBlack)(TextType type, NSString *text, NSURL *url);

@interface LinkLabel : UILabel

/**
 设置显示内容
 */
@property(nonatomic ,strong)NSString *title;

/**
 网址链接
 */
@property(nonatomic ,strong)NSString *url;

@property(nonatomic ,copy)TapLinkBlack linkBlack;

/**
 设置点击打开网页

 @param title 显示标题
 @param url 要打开的的链接
 */
-(void)setUrlWithTitle:(NSString *)title url:(NSString *)url;

@end

主要执行文件

#import "LinkLabel.h"

//判断字符串是否为空
#define isNil(string) ([string isEqual:[NSNull null]] || string == nil || [string isEqualToString:@""] ||[string isEqualToString:@"<null>"] || [string isEqualToString:@"(null)"])?(YES):(NO)

@interface LinkLabel()

@end

@implementation LinkLabel

-(id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.userInteractionEnabled = YES;
        [self addGestureRecognizer:[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(topAction)]];
    }
    return self;
}

/**
 重写set方法

 @param title 显示内容
 */
-(void)setTitle:(NSString *)title
{
    if (!isNil(title)) {
        _title = title;
        if ([self checkTelNumber:title]) {
            self.attributedText = [self setAttributedString:title];
        }else if ([self validateEmail:title]){
            self.attributedText = [self setAttributedString:title];
        }else{
            self.text = title;
        }
    }
}

/**
 设置点击打开网页

 @param title 显示标题
 @param url 要打开的的链接
 */
-(void)setUrlWithTitle:(NSString *)title url:(NSString *)url
{
    if (!isNil(url)) {
        _url = url;
        if (!isNil(title)) {
            _title = title;
            self.attributedText = [self setAttributedString:_title];
        }
    }else{
        _url = @"";
        _title = title;
        self.text = title;
    }
}


/**
 设置链接显示样式

 @param title 显示内容
 @return 返回链接样式文本
 */
-(NSMutableAttributedString *)setAttributedString:(NSString *)title
{
    NSRange range = NSMakeRange(0, title.length);
    NSMutableAttributedString *attribtStr = [[NSMutableAttributedString alloc]initWithString:title];
    //设置下划线
    [attribtStr addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:range];
    //字体颜色
    [attribtStr addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:range];
    return attribtStr;
}

//手机号码验证
-(BOOL)checkTelNumber:(NSString *)telNumber
{
    NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|7[06-8])\\d{8}$";
    NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
    return [regextestmobile evaluateWithObject:telNumber];
}

//正则表达式判断邮箱
-(BOOL)validateEmail:(NSString *)email
{
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
    return [emailTest evaluateWithObject:email];
}

//验证URL
-(BOOL)checkURL:(NSString*)url
{
    NSString*pattern =@"http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?";
    NSPredicate*pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",pattern];
    BOOL isMatch = [pred evaluateWithObject:url];
    return isMatch;
}

//点击事件
-(void)topAction
{
    if (!isNil(_url)) {
        if ([self checkURL:_url]) {
            NSURL *url = [NSURL URLWithString:_url];
            if (_linkBlack) {
                _linkBlack(LINK_TYPE,_title,url);
            }
        }
    }else if (!isNil(_title)){
        if ([self checkTelNumber:_title]) {
            NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"tel://%@",_title]];
            if (_linkBlack) {
                _linkBlack(TEL_TYPE,_title,url);
            }
        }else if ([self validateEmail:_title]){
            NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"mailto://%@",_title]];
            if (_linkBlack) {
                _linkBlack(EMAIL_TYPE,_title,url);
            }
        }
    }
}

具体使用代码如下

    LinkLabel *titleLabel = [[LinkLabel alloc]initWithFrame: CGRectMake(0, 100, CGRectGetWidth(self.view.frame), 40)];
    titleLabel.textAlignment = NSTextAlignmentCenter;
    titleLabel.title = @"这只是一个标题";
    [self.view addSubview:titleLabel];

    LinkLabel *linkLabel = [[LinkLabel alloc]initWithFrame:CGRectMake(0, 200, CGRectGetWidth(self.view.frame), 40)];
    linkLabel.textAlignment = NSTextAlignmentCenter;
    [linkLabel setUrlWithTitle:@"百度一下" url:@"https://www.baidu.com"];
    linkLabel.linkBlack = ^(TextType type, NSString *text, NSURL *url) {
        if (type == LINK_TYPE){
            WYWebController *webVC = [[WYWebController alloc]init];
            webVC.url = [NSString stringWithFormat:@"%@",url];
            [self.navigationController pushViewController:webVC animated:YES];
        }
    };
    [self.view addSubview:linkLabel];

    LinkLabel *telLabel = [[LinkLabel alloc]initWithFrame:CGRectMake(0, 300, CGRectGetWidth(self.view.frame), 40)];
    telLabel.textAlignment = NSTextAlignmentCenter;
    telLabel.title = @"18612341234";
    telLabel.linkBlack = ^(TextType type, NSString *text, NSURL *url) {
        if (type == TEL_TYPE) {
            NSLog(@"手机号:%@",text);
            //调用系统方法拨号
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
                if (@available(iOS 10.0, *)) {
                    [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
                } else {
                    [[UIApplication sharedApplication] openURL:url];
                }
            });
        }
    };
    [self.view addSubview:telLabel];

    LinkLabel *emailLabel = [[LinkLabel alloc]initWithFrame: CGRectMake(0, 400, CGRectGetWidth(self.view.frame), 40)];
    emailLabel.textAlignment = NSTextAlignmentCenter;
    emailLabel.title = @"18612341234@qq.com";
    emailLabel.linkBlack = ^(TextType type, NSString *text, NSURL *url) {
        if (type == EMAIL_TYPE) {
            NSLog(@"手机号:%@",text);
            //调用系统方法拨号
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
                if (@available(iOS 10.0, *)) {
                    [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
                } else {
                    [[UIApplication sharedApplication] openURL:url];
                }
            });
        }
    };
    [self.view addSubview:emailLabel];

点击这里下载Demo

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值