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

时间:2016-04-13 10:44:57

标签: ios hyperlink uitextview uicolor

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

screenshot

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

3 个答案:

答案 0 :(得分:2)

虽然没有公共API可以做到这一点,但我很好奇并决定深入研究UITextField UITextField。我发现_sharedHighlightView _sharedHighlightView上有一个类方法,它返回私有private header类的实例。这是负责突出显示的班级。 Swizzling 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! } } 并更改其颜色将允许您更改任何数据检测链接的颜色:

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

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)

在视图控制器中:

results = [max(x,y) for x,y in zip(location1, location2)]
total = sum(results)

结果:

_UIHighlightView

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

答案 1 :(得分:1)

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

来自UITextViewDelegate协议参考:

  

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

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

您可能希望还原touchesEndedtouchesCancelled上的所有更改。

或者,你可以make your own subclass and manually handle the above

答案 2 :(得分:-1)

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