TTTAttributedLabel可以滿足在一段文本內容中展示網址鏈接:
TTTAttributedLabel *label = [TTTAttributedLabel alloc] initWithFrame:frame];
label.delegate = self;
label.enabledTextCheckingTypes = NSTextCheckingTypeLink;
label.numberOfLines = 0;
[self.view addSubView:label];
IMG_0185.PNG
當然你也可以更改鏈接的樣式:
NSMutableDictionary *linkAttributes = [NSMutableDictionary dictionary];
[linkAttributes setValue:[NSNumber numberWithBool:NO] forKey:(NSString *)kCTUnderlineStyleAttributeName];
[linkAttributes setValue:(__bridge id)ciweiLinkColor.CGColor forKey:(NSString *)kCTForegroundColorAttributeName];
label.linkAttributes = linkAttributes;
IMG_0181.PNG
只需要實現代理方法:
- (void)attributedLabel:(TTTAttributedLabel *)label
didSelectLinkWithURL:(NSURL *)url{
//這里可以對點擊的url進行操作
}
在很多的社交類軟件包括微信、微博等軟件中常常會遇到下面這樣的需求:
IMG_0183.PNG
在帖子評論中,如果這個評論被回復了(子回復),子回復中的昵稱可點擊并且點擊后一般是去這個用戶的個人主頁面:
NSString *string = [NSString stringWithFormat:@"%@ 回復 %@:%@",reply.nickname,reply.toNickname,reply.content];
label.text = string;
NSRange range = NSMakeRange(0, reply.nickname.length);
[self addLinkToURL:[NSURL URLWithString:[NSString stringWithFormat:@"scheme://?type=1&business_id=%@",reply.userId]] withRange:range];
NSRange toRange = NSMakeRange(reply.nickname.length+4, reply.toNickname.length);
[self addLinkToURL:[NSURL URLWithString:[NSString stringWithFormat:@"scheme://?type=1&business_id=%@",reply.toUserId]] withRange:toRange];
因為這里用到時通過點擊連接跳轉到app內部的一個現有頁面,所以這里我傳入的鏈接是Scheme Url,在處理代理方法的時候:
- (void)attributedLabel:(TTTAttributedLabel *)label
didSelectLinkWithURL:(NSURL *)url{
NSString *urlStr = [url absoluteString];
if([urlStr hasPrefix:@"scheme"]){
[[UIApplication sharedApplication] openURL:url];
}else{
//這里可以對點擊的url進行操作
}
}
然后在AppDelegate中處理點擊昵稱的方法,這里會把昵稱的超鏈接傳入url:
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
}
其實大可不必這么費勁,完全可以將其分成兩部分控件:第一部分展示昵稱信息,給其賦予點擊事件;第二部分展示回復文本內容。
但是考慮到,如果是從一個分享網頁中點擊昵稱,需要app作出響應,是的自己的app更加靈活;或者是在回復內容中需要做@某個用戶的操作,為了以后的擴展就這么干了。【仁者見仁】
點擊帖子回復對其進行回復操作:
對label的父控件添加點擊手勢:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(subReplyClick:)];
[view addGestureRecognizer:tap];
但是運行代碼之后發現TTTAttributedLabel的父控件添加手勢之后,其代理方法*attributedLabel:(TTTAttributedLabel *)label
didSelectLinkWithURL:(NSURL )url不再被執行。
解決手勢沖突:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(subReplyClick:)];
tap.delegate = self;
[view addGestureRecognizer:tap];
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([touch.view isKindOfClass:[TTTAttributedLabel class]]){
TTTAttributedLabel *label = (TTTAttributedLabel *)touch.view;
if ([label containslinkAtPoint:[touch locationInView:label]]){
return NO;
}else{
return YES;
}
}else{
return YES;
}
}
然后現在就應該是可以了!!!TTTAttributedLabel是一個很強大控件,其他的使用方法以后再說吧。。。