如何更改UITextView Hyperlink选择背景颜色?

我正在使用UITextView来选择主题标签。 它可以完美地检测水龙头。 我的问题是选择颜色。 它看起来很黑,我希望文字在选择上略微淡化。 这就是我现在所拥有的:

截图

我已经尝试更改tintColorNSForegroundColorAttributeNameNSBackgroundColorAttributeName但它不起作用。

检测到的链接的选定或突出显示颜色没有文档属性,但您应该能够通过覆盖委托方法textView:shouldInteractWithURL:inRange:textView:shouldInteractWithURL:inRange:更改颜色来实现相同的效果。

从UITextViewDelegate协议参考:

如果用户点击或长按URL链接,则文本视图会调用此方法。 此方法的实现是可选的。 默认情况下,文本视图会打开负责处理URL类型的应用程序并将URL传递给它。 您可以使用此方法触发替代操作,例如在当前应用程序的Web视图中的URL处显示Web内容。

最后一个参数是名为characterRange的NSRange对象,它表示包含抽头URL(或主题标签)的字符范围。 使用该范围,您应该能够添加NSForegroundColorAttributeName等属性,以便仅更改已轻击的特定主题标签的颜色。

您可能希望还原touchesEndedtouchesCancelled上的任何更改。

或者,您可以创建自己的子类并手动处理上述内容 。

虽然没有公共API可以做到这一点,但我很好奇,并决定挖掘UITextField的私有头 。 我发现UITextField _sharedHighlightView上有一个类方法,它返回私有_UIHighlightView类的一个实例。 这是负责突出显示的class级。 Swizzling _sharedHighlightView并更改其颜色将允许您更改任何数据检测链接的颜色:

警告:这是一个使用方法调配和私有API /属性的hack。

 class MyTextView: UITextView { var newHighlightView: AnyObject? func changeHighlight() { self.newHighlightView = UITextView.performSelector(Selector("_sharedHighlightView")).takeUnretainedValue() self.newHighlightView?.setValue(UIColor.redColor().colorWithAlphaComponent(0.6), forKey: "_color") let originalHighlightView = class_getClassMethod(MyTextView.self, Selector("_sharedHighlightView")) let newHighlightView = class_getClassMethod(MyTextView.self, #selector(MyTextView.swizzleHighlightView)) method_exchangeImplementations(originalHighlightView, newHighlightView) } func swizzleHighlightView() -> AnyObject { return self.newHighlightView! } } 

在View Controller中:

 let textView = MyTextView(frame: CGRect(x: 0, y: 40.0, width: 200.0, height: 200.0)) textView.dataDetectorTypes = .All textView.editable = false textView.text = "Some text. http://www.google.com/" textView.changeHighlight() self.view.addSubview(textView) 

结果:

突出显示颜色已更改

通过不强行解开任何选项,这可能会进一步清理。

可以解决此问题,您可以使用UIButton而不是textview。 通过使用按钮,您可以获得相同的效果。