UILabel點選呼叫電話以及郵箱,UILabel超連結效果 NSMutableAttributedString文字樣式設定
阿新 • • 發佈:2019-01-01
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];