2016-04-13 177 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

這或許可以通過不強制展開任何自選清理遠一點。