2016-04-13 191 views
1

我正在使用UITextView使标签可选。它完美地检测水龙头。我的问题是选择颜色。它看起来是黑色的,我希望文本在选择上淡入淡出。 这就是我现在得到:如何更改UITextView超链接选择背景颜色?

screenshot

我试图改变tintColor,在NSForegroundColorAttributeNameNSBackgroundColorAttributeName,但它不工作。

回答

0

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

UITextViewDelegate协议参考:

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

最后一个参数是一个名为characterRange的NSRange对象,它表示包含点击URL(或标签)的字符范围。使用该范围,您应该能够添加诸如NSForegroundColorAttributeName之类的属性,以仅更改所点击的特定哈希标签的颜色。

您可能会想要恢复touchesEndedtouchesCancelled上的任何更改。

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

0

解决此问题的方法可以完成,您可以使用UIButton而不是textview。通过使用按钮,你可以有相同的效果。

+0

我在用途上使用了一个textview。拥有多个行动点。这是不可能的一个uibutton – jonypz

2

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

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

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! 
    } 
} 

在您的视图控制器:

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) 

结果:

Highlight color changed

这或许可以通过不强制展开任何自选清理远一点。