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是一个很强大控件,其他的使用方法以后再说吧。。。
网友评论
我现在有这样一个需求,
有一个字符串, 前面是中文,后面是英文,目前是用\n 来 分割的.
需求就是\n后面换行开始的文字,行间距要稍微大一点点
[attrString addAttribute:NSParagraphStyleAttributeName value:paragrapStyle range:NSMakeRange(0, str.length)];
TTTAttributedLabel.m 635行
- (BOOL)containslinkAtPoint:(CGPoint)point {
return [self linkAtPoint:point] != nil;
}
你试试这个:
[linkAttributes setValue:(__bridge id)color.CGColor forKey:kTTTBackgroundFillColorAttributeName];
[activeLinkAttributes setValue:(__bridge id)active.CGColor forKey:(NSString *)kCTForegroundColorAttributeName];
label.activeLinkAttributes =activeLinkAttributes;
attributeLabel.enabledTextCheckingTypes = NSTextCheckingTypeLink; // 在文本内容改变时,自动检测链接
attributeLabel.text = @"http://www.baidu.com";
设置类型必须放到赋值text上面,不然不起作用