UILabel 和 NSLinkAttributeName:链接不可点击

Posted

技术标签:

【中文标题】UILabel 和 NSLinkAttributeName:链接不可点击【英文标题】:UILabel and NSLinkAttributeName: Link is not clickable 【发布时间】:2013-11-20 04:39:48 【问题描述】:

我想在我的 ios 7 项目中使用带有 NSLinkAttributeName 的属性字符串在 UILabel 实例内创建可点击链接,现在终于可以在不使用外部库的情况下实现这一点。

NSURL *url = [NSURL URLWithString:@"http://www.google.com"];

NSDictionary *attr = [NSDictionary dictionaryWithObjectsAndKeys:
                          url, NSLinkAttributeName, nil];

在字符串上应用该属性会将文本显示为蓝色并带有下划线,但单击/点击时没有任何反应。为标签启用了用户交互。 有人知道怎么做这个吗?谢谢!

【问题讨论】:

【参考方案1】:

我现在可以回答我自己的问题了: 我现在使用UITextView 而不是UILabel。我已将 UITextView 格式化为外观和行为类似于我的标签并添加:

UITextView *textView = [[UITextView alloc] init];
textView.scrollEnabled = NO;
textView.editable = NO;
textView.textContainer.lineFragmentPadding = 0;
textView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0);
textView.delegate = self;

别忘了设置委托,你要实现UITextViewDelegate!现在我们实现委托方法:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)url inRange:(NSRange)characterRange

     return YES;

这会在点击/点击时自动从我的问题中的属性字符串中打开提供的NSURL-instance。

记住:这仅适用于 iOS 7,对于旧版支持,您需要外部库

更新:

UITextViews 的行为就像标签一样最终是一团糟,我偶然发现了一些可怕的 iOS 行为。我最终使用了 TTTAttributedLabel 库,它非常棒,让我可以使用标签而不是 UITextViews。

【讨论】:

.textContainer 是这里的关键。我将我的标签换成 textviews 并让链接正常工作,但它正在摆脱布局和外观。 你的意思是 UITextViewDelegate 不是 UITextFieldDelegate 是的,当然,我已经纠正了错误 - 谢谢。 @max.mustermann:您能否详细说明是什么问题导致您放弃了这种方法? @Ricardo,刚刚指出设置textView.textContainer.--- 值是让 UITextViews 像 UILabel 一样布局的关键。也就是说,那些值,调整TextView中文字的padding;将它们设置为零会给你一个具有 UITextView 功能的 UILabel 外观。

以上是关于UILabel 和 NSLinkAttributeName:链接不可点击的主要内容,如果未能解决你的问题,请参考以下文章

选框和静态 UILabel 文本

UILabel的常用属性和方法

使 UILabel 以不断变化的内容和 AutoLayout 为中心

在UITableview swift中使用UILabel和UIWebView设置heightForRow

UILabel 自动大小和位置

UILabel 动态高度和 UIImageView 恒定高度