2017-05-16 3 views
0

Ich habe lange mit Textur (früher AsyncDisplayKit) gearbeitet und habe mich daran gewöhnt, einfach Telefonnummern und Links in ASTextNode anklickbar zu machen.Geöffnete Links in UITextView ohne HTML öffnen

Dann wechselte ich zu einem alten Xamarin-Projekt und benötigte dort die gleiche Funktion. Ich habe mit der Suche nach der richtigen und einfachen Lösung für dieses Problem gekämpft und herausgefunden, dass Leute vorschlagen, mit UIWebView und solchen Dingen zu arbeiten.

Es ist ein bisschen schwierig, also werde ich versuchen, einige Schritte zu beschreiben, die ich bei der Lösung dieses Problems gefunden habe.

Antwort

0
  • Versuchen Sie, Ihre Zeichenfolge für mögliche Links zu analysieren. In meinem Fall ist die Zeichenfolge immer eine Reihe von Telefonnummern wie - "88002000600 +7999999999 8888800888" so ist es ein einfacher Fall, aber es sollte kein Problem sein, Pars für Website-Links, E-Mails von Regex.
  • Make zugeschrieben String und notwendigen Attribute wie diese

zuordnen -

//something right here and get your potential links list 
    var attributedContacts = new NSMutableAttributedString (value as string, UIFont.SystemFontOfSize (14), UIColor.White, UIColor.Clear); 
       foreach (var item in numbers) { 
        var nsStringItem = new NSString (item); 
        var nsTelPromptLink = new NSString (string.Format ("telprompt://{0}", item)); 
        var range = attributedContacts.MutableString.LocalizedStandardRangeOfString (nsStringItem); 
        attributedContacts.AddAttribute (new NSString ("TextLinkAttributeName"), nsTelPromptLink, range); 
       } 
       textView.AttributedText = attributedContacts; 
  • Dann sollten Sie Gestenerkenner auf Ihren Text-Ansicht und Griff tippt die folgende Art und Weise:

-

var tapRecognizer = new UITapGestureRecognizer ((UITapGestureRecognizer recognizer) => { 
       var textView = recognizer.View as UITextView; 
       if (textView == null) 
        return; 
       var tappedPoint = recognizer.LocationInView (textView); 
       tappedPoint.X -= textView.TextContainerInset.Left; 
       tappedPoint.Y -= textView.TextContainerInset.Top; 
       var layoutManager = textView.LayoutManager; 
       nfloat tmp = 0; 
       var tappedCharacterIndex = layoutManager.CharacterIndexForPoint (tappedPoint, textView.TextContainer, ref tmp); 
       NSRange range = new NSRange(); 
       var url = textView.AttributedText.GetAttribute ("TextLinkAttributeName", (nint)tappedCharacterIndex, out range) as NSString; 
       if (url == null) 
        return; 
       UIApplication.SharedApplication.OpenUrl (new NSUrl (url.ToString())); 
      }); 

      ContactsTextView.AddGestureRecognizer (tapRecognizer); 

Also, es ist ziemlich grobe Lösung und es sollte zusätzliche Kontrollen geben, aber ich denke, die Idee selbst ist ziemlich klar. Es kann leicht auf native Lösungen in Swift oder Objective-C angewendet werden.

+0

https://github.com/TextureGroup/Texture/pull/290 –

Verwandte Themen