UILabel和NSLinkAttributeName:链接不可单击

max*_*ann 34 nsurl nsattributedstring uilabel clickable ios7

我想使用属性字符串NSLinkAttributeNameUILabel在我的iOS 7项目中的实例内创建可点击链接,现在终于可以在不使用外部库的情况下实现.

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

NSDictionary *attr = [NSDictionary dictionaryWithObjectsAndKeys:
                          url, NSLinkAttributeName, nil];
Run Code Online (Sandbox Code Playgroud)

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

max*_*ann 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;
Run Code Online (Sandbox Code Playgroud)

不要忘记设置代理,你必须实现UITextViewDelegate!现在我们实现委托方法:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)url inRange:(NSRange)characterRange
{
     return YES;
}
Run Code Online (Sandbox Code Playgroud)

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

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

更新:

UITextViews表现得像标签一样,最后总是一团糟,我偶然发现了一些可怕的iOS行为.我最终使用了TTTAttributedLabel库,它非常棒,允许我使用标签代替UITextViews.

  • @ max.mustermann:你能详细说明导致你放弃这种方法的问题吗? (5认同)
  • .textContainer是关键所在.我将我的标签换成了文本视图,并且链接正常工作,但是它放弃了布局和外观. (2认同)
  • @Ricardo,只是指出设置`textView.textContainer .---`值是让UITextViews像UILabel一样布局的关键.也就是说,那些值,调整TextView中文本的填充; 将它们设置为零可以看到具有UITextView功能的UILabel. (2认同)