1. 程式人生 > >UILabel點選呼叫電話以及郵箱,UILabel超連結效果 NSMutableAttributedString文字樣式設定

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._%+-][email protected][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 [email protected]"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 = @"[email protected]";
    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

這裡寫圖片描述