我正在开发一个有趣的应用程序,我可以在其中接收来自远程 Web 服务(如 Twitter)的消息。有时这些消息包含 URL:s,我想让这些消息可点击。我想知道哪种方法是最好的。我试过 NSLinkAttributeName 但它不适用于 iOS。是否可以创建一个透明按钮并将其放置在文本视图中正确位置的上方?我怎么能这样做?还是有更好/更简单的方法?url 的位置和长度可以变化。
3 回答
有两种很好的方法可以解决这个问题:
1. CoreText,或者更确切地说是围绕它的包装器,如TTTAtributedLabel
这是最强大的解决方案。它支持 Datadetectortypes(尽管您最好在显示它之前进行自己的性能检测)并且它相对流行。
但是,根据您的使用情况,它可能会影响您的 tableview 的滚动性能。
2. 在您的标签上方动态放置按钮,例如IFTweetLabel
这是简单的解决方案。IFTweetLabel 基本上是 UILabel 的一个插件,它开箱即用的性能非常好。但是,如果您希望对其进行过多的自定义,您最终会遇到它的限制。更不用说它在 100% 的时间里都表现得不完美。YMMV。
一种选择是使用UIDataDetectorTypeLink
. 检查此链接以获取更多详细信息。
// Create textview, centering horizontally
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 10, 320, 50)];
// Set font, background and alignment
[textView setFont:[UIFont boldSystemFontOfSize:16]];
[textView setBackgroundColor:[UIColor blackColor]];
[textView setTextAlignment:UITextAlignmentCenter];
// Unfortunately the link will show as blue even with this setting
// [textView setTextColor:[UIColor greenColor]];
// Edit and scrolling off
[textView setEditable:NO];
[textView setScrollEnabled:NO];
// Set data type to specify URL/link
[textView setDataDetectorTypes:UIDataDetectorTypeLink];
// Set text as URL
[textView setText:@"text.com"];
[self.view addSubview:textView];
其他一些选项是 UIWebview
与代表一起处理其中的 url 触摸。另一种选择是花哨的 UILabels
对于您提出的其他问题,请查看如何在 UI Web 视图中打开 UITextView URL?, 有没有办法创建自定义 UIDataDetectorTypes?并使用过滤器更改 UITextView 链接的颜色?
NSLinkAttributeName
可以用 敲击UITextView
,但不能用敲击UILabel
。请注意,它适用于 iOS 7+,并且 UITextView 必须是Selectable
(在 Storyboard 中)。
快速演示:
let attributedText = NSMutableAttributedString(string: "Hello world")
attributedText.addAttribute(.link, value: URL(string: "https://example.com")!, range: NSRange(location: 0, length: attributedText.length))
textView.attributedText = attributedText