UILabel和NSLinkAttributeName:链接不可点击

34

我想在我的iOS 7项目中,使用带属性的字符串和 NSLinkAttributeName 来创建可点击的链接,并将其放置在一个UILabel实例中。这现在是可能的,而无需使用外部库。

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

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

将属性应用于字符串会以蓝色和下划线的形式显示文本,但单击/轻击时不会发生任何事情。标签启用用户交互。 有人知道如何做吗?谢谢!

1个回答

49
我现在可以回答自己的问题了: 我现在使用的是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 实例的属性字符串。

请记住:此功能仅适用于 iOS 7,如需向后兼容,您需要使用外部库。

更新:

最终使 UITextView 的行为与标签完全一致是一团糟,我遇到了一些丑陋的 iOS 行为。最终我使用了TTTAttributedLabel 库,它非常棒,并允许我使用标签代替 UITextView


2
这里关键是 .textContainer。我将标签替换为文本视图并使链接正常工作,但它会影响布局和外观。 - WCByrne
1
你肯定是指UITextViewDelegate而不是UITextFieldDelegate。 - Mark Bridges
是的,当然。我已经纠正了错误 - 谢谢。 - Habizzle
5
@max.mustermann: 你能详细说明是什么问题导致你放弃了这种方法吗? - Lily Ballard
2
@Ricardo 刚刚指出,设置 textView.textContainer.--- 的值是使 UITextViews 像 UILabels 一样布局的关键。也就是说,这些值可以调整 TextView 中文本的填充;将它们设置为零可以让您获得 UILabel 的外观和 UITextView 的功能。 - WCByrne
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接