Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何更改UITextView超链接选择的背景色?_Ios_Hyperlink_Uitextview_Uicolor - Fatal编程技术网

Ios 如何更改UITextView超链接选择的背景色?

Ios 如何更改UITextView超链接选择的背景色?,ios,hyperlink,uitextview,uicolor,Ios,Hyperlink,Uitextview,Uicolor,我正在使用UITextView使hashtags可选择。它能很好地检测水龙头。我的问题是选择颜色。它看起来是黑色的,我希望文本在选择时淡出一点。 这是我现在得到的: 我已尝试更改tintColor、NSForegroundColorAttributeName和NSBackgroundColorAttributeName,但无效。检测到的链接的选定或突出显示的颜色没有文档属性,但是,通过覆盖委托方法textView:shouldInteractWithURL:inRange:并自己更改颜色,您应

我正在使用UITextView使hashtags可选择。它能很好地检测水龙头。我的问题是选择颜色。它看起来是黑色的,我希望文本在选择时淡出一点。 这是我现在得到的:


我已尝试更改
tintColor
NSForegroundColorAttributeName
NSBackgroundColorAttributeName
,但无效。

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

从协议参考中:

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

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

您可能希望恢复
touchesend
touchecancelled
上的任何更改


或者,您也可以。

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

尽管没有公共API来实现这一点,但我很好奇,决定深入研究for
UITextField
。我发现在
UITextField
\u sharedHighlightView
上有一个class方法,它返回私有类的实例。这是负责突出显示的班级。旋转
\u sharedHighlightView
并更改其颜色将允许您更改任何检测到的数据链接的颜色:

警告:这是一种使用方法swizzling和私有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)
结果:


如果不强制展开任何选项,这可能会被进一步清理。

我是故意使用textview的。有多个动作点。用uibutton是不可能的