2015-06-24 17 views
5

używam tego kodu:UITextView otwarty związek z beczki

var textView = UITextView(x: 10, y: 10, width: CardWidth - 20, height: placeholderHeight) //This is my custom initializer 
textView.text = "dsfadsaf www.google.com" 
textView.selectable = true 
textView.dataDetectorTypes = UIDataDetectorTypes.Link 
textView.delegate = self 
addSubview(textView) 

Problemem jest link musi długo kranu gest otwarcia. Chcę, aby otwierał się jednym kliknięciem, tak jak w aplikacji Facebook.

+0

[Ta odpowiedź] (http://stackoverflow.com/a/26495954/1033565) Benjamina Bojko może ci pomóc. – paolo

+1

FYI - Możliwe jest również [tworzenie odsyłaczy do tappable w UILabel] (http://stackoverflow.com/a/29352519/168594). (W przypadku, gdy korzystałeś tylko z UITextView dla detektorów danych.) – zekel

Odpowiedz

6

Poniższy przykład działa tylko na iOS 8+

Tap rozpoznawania:

let tapRecognizer = UITapGestureRecognizer(target: self, action: Selector("tappedTextView:")) 
myTextView.addGestureRecognizer(tapRecognizer) 
myTextView.selectable = true 

oddzwaniania:

func tappedTextView(tapGesture: UIGestureRecognizer) { 

    let textView = tapGesture.view as! UITextView 
    let tapLocation = tapGesture.locationInView(textView) 
    let textPosition = textView.closestPositionToPoint(tapLocation) 
    let attr: NSDictionary = textView.textStylingAtPosition(textPosition, inDirection: UITextStorageDirection.Forward) 

    if let url: NSURL = attr[NSLinkAttributeName] as? NSURL { 
     UIApplication.sharedApplication().openURL(url) 
    } 

} 

Swift 3 i żadna siła nie rozpakowuje:

func tappedTextView(tapGesture: UIGestureRecognizer) { 
     guard let textView = tapGesture.view as? UITextView else { return } 
     guard let position = textView.closestPosition(to: tapGesture.location(in: textView)) else { return } 
     if let url = textView.textStyling(at: position, in: .forward)?[NSLinkAttributeName] as? URL { 
      UIApplication.shared.open(url) 
     } 
    } 
+0

Nie można użyć klucza 'NSLinkAttributeName' w Swift 4. Prostym rozwiązaniem jest użycie klawisza' 'NSLink' 'zamiast. – Legonaftik