UILabel - 字符串作为文本和链接



我有一个UILabel,我从服务器获取其文本。一些文本将被标识为链接,并且在触摸这些链接时应执行一些操作。例如

NSString *str = @"我的电话号码是 645-345-2345,我的地址是 xyz";

这是UILabel的完整文本。我只有一个UILabel显示此文本(文本是动态的。我只是举了一个例子。单击这些链接后,我需要执行诸如导航到其他屏幕或拨打电话之类的操作。
我知道我可以在OHAttributedLabel的帮助下显示这样的文本。链接可以显示如下:

[label1 addCustomLink:[NSURL URLWithString:@"http://www.foodreporter.net"] inRange:[txt rangeOfString:someString]];  

但是我想知道如何使这些文本链接执行某些操作,例如导航到不同的屏幕或拨打电话。
如果需要更多解释,请告诉我。

您可以将

自定义操作添加到任何可用的UILabel替换项,这些替换项支持使用稍后将拦截的虚假URL 方案的链接:

TTTAttributedLabel *tttLabel = <# create the label here #>;
NSString *labelText = @"Lost? Learn more.";
tttLabel.text = labelText;
NSRange r = [labelText rangeOfString:@"Learn more"]; 
[tttLabel addLinkToURL:[NSURL URLWithString:@"action://show-help"] withRange:r];

然后,在您的TTTAttributedLabelDelegate

- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url {
    if ([[url scheme] hasPrefix:@"action"]) {
        if ([[url host] hasPrefix:@"show-help"]) {
            /* load help screen */
        } else if ([[url host] hasPrefix:@"show-settings"]) {
            /* load settings screen */
        }
    } else {
        /* deal with http links here */
    }
}

TTTAttributedLabel是OHAttributedLabel的一个分支。

如果您想要更复杂的方法,请查看 Nimbus 属性标签。它支持开箱即用的自定义链接。

您可以将 UITextView 与电话号码和链接检测一起使用 是,滚动禁用是 用户交互启用是,而不是 UILabel。

我的项目已经成功地使用了OHAttributedLabel。查看

-(BOOL)attributedLabel:(OHAttributedLabel*)attributedLabel shouldFollowLink:(NSTextCheckingResult*)linkInfo;

方法OHAttributedLabelDelegate(链接(。它允许您决定单击链接时会发生什么。如果您查看 OHAttributedLabel 项目中示例的源,它将用于显示警报。如果您在这种情况下返回NO(以防止默认操作发生(,您可以做任何您想做的事情,例如导航等。

但请注意,这要求您仅从文本中正确确定操作。对于我们的项目,我们使用了稍微花哨的解决方案,服务器向我们发送带有标签的文本以及要为每个标签执行的命令列表。

有一个名为FancyLabel的项目,它是关于你需要的。不过,它可能需要一些自定义。另外,我认为 Three20 具有此功能,但如果您尚未使用它,它可能是一种矫枉过正。

还有一个更简单的解决方案,如果你的所有链接都是电话\地址\网址。您可以简单地使用 UITextView 而不是 UILabel。它具有自动检测电话,地址等功能(只需选中IB中的框(

您还可以通过覆盖 openURL 来自定义操作来响应这些链接上的单击事件,如此处所述

是否有特定原因必须使用 UILabel 而不是 UITextView?请注意,属性标签的许多实现都继承自 UIView,或者没有实现 UILabel 的所有功能。

您可以使用

自定义按钮来提供链接的外观..如果您不想使用按钮,也可以在自定义标签上添加手势..

UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTappedOnLink:)];
// if labelView is not set userInteractionEnabled, you must do so
[labelView setUserInteractionEnabled:YES];
[labelView addGestureRecognizer:gesture];

我不喜欢被迫使用 UITextView 或第三方库,因为我只需要一个呈现链接的轻量级标签(并告诉我它们何时被点击!

这是我对能够检测链接点击的轻量级UILabel子类的尝试。 这种方法与我见过的其他方法不同,因为它通过类别扩展添加到NSTextStorage的委托回调来访问UILabel的共享NSLayoutManager。 美妙之处在于UILabel执行其本机布局和绘图-其他UILabel替换通常会用额外的NSLayoutManager/NSTextContainer来增强或替换本机行为。

可能是App Store安全,但有些脆弱 - 使用风险自负!

https://github.com/TomSwift/TSLabel

最新更新