Ich habe dies stundenlang gesucht, aber ich habe versagt. Ich weiß wahrscheinlich nicht einmal, wonach ich suchen soll.
Viele Anwendungen haben Text und in diesem Text sind Web-Hyperlinks in gerundeter Form. Wenn ich darauf klicke, wird es UIWebView
geöffnet. Was mich verwundert, ist, dass sie häufig benutzerdefinierte Links haben. Wenn Wörter beispielsweise mit # beginnen, können sie auch angeklickt werden, und die Anwendung öffnet daraufhin eine andere Ansicht. Wie kann ich das machen? Ist es möglich mit UILabel
oder brauche ich UITextView
oder etwas anderes?
Swift 4
. Es verwendet,UITextView
aber es verhält sich wie einUILabel
. Ich habe die Lösungen hier ausprobiert und konnte keine genaue Linkerkennung erhalten.Antworten:
Wenn ein anklickbarer Link in Text von UILabel angezeigt werden soll, müssen im Allgemeinen zwei unabhängige Aufgaben gelöst werden:
Der erste ist einfach. Ab iOS 6 unterstützt UILabel die Anzeige von zugeordneten Zeichenfolgen. Sie müssen lediglich eine Instanz von NSMutableAttributedString erstellen und konfigurieren:
Das ist es! Mit dem obigen Code zeigt UILabel String mit einem Link an
Jetzt sollten wir Berührungen dieses Links erkennen. Die Idee ist, alle Abgriffe in UILabel zu erfassen und herauszufinden, ob die Position des Abgriffs nahe genug am Link war. Um Berührungen zu erfassen, können wir dem Etikett eine Tippgestenerkennung hinzufügen. Stellen Sie sicher, dass userInteraction für das Etikett aktiviert ist. Es ist standardmäßig deaktiviert:
Jetzt das raffinierteste Zeug: herauszufinden, ob sich der Tipp dort befand, wo der Link angezeigt wird, und nicht auf einem anderen Teil des Etiketts. Wenn wir ein einzeiliges UILabel hätten, könnte diese Aufgabe relativ einfach gelöst werden, indem die Bereichsgrenzen, in denen der Link angezeigt wird, fest codiert werden. Lassen Sie uns dieses Problem jedoch eleganter und für den allgemeinen Fall lösen - mehrzeiliges UILabel ohne vorherige Kenntnisse über das Linklayout.
Einer der Ansätze besteht darin, die in iOS 7 eingeführten Funktionen der Text Kit-API zu verwenden:
Speichern Sie erstellte und konfigurierte Instanzen von NSLayoutManager, NSTextContainer und NSTextStorage in Eigenschaften in Ihrer Klasse (höchstwahrscheinlich der Nachkomme von UIViewController) - wir benötigen sie in anderen Methoden.
Aktualisieren Sie jetzt jedes Mal, wenn das Etikett seinen Rahmen ändert, die Größe von textContainer:
Und schließlich erkennen Sie, ob der Hahn genau auf dem Link war:
quelle
cellForRowAtIndexPath
? Ich erstelle und konfiguriere Instanzen innerhalbcellForRowAtIndexPath
und hoste diehandleTapOnLabel
Funktion auch darin. Abercell.textLabel.addGestureRecognizer(UITapGestureRecognizer(target: cell, action: "handleTapOnLabel:"))
ich bekommeunrecognized selector
.textAlignment
Attribut des Labels auf festgelegt istNSTextAlignmentCenter
. Wenn Sie nicht zentrierten Text verwenden, müssen Sie die Berechnung Ihres TextestextContainerOffset
im obigen Code anpassen .x
Wertes vontextContainerOffset
wird die Konstante0.5
verwendet. Dadurch wird die richtige Position für berechnetNSTextAlignmentCenter
. Verwenden Sie den Wert von, um links, natürlich oder gerechtfertigt auszurichten0.0
. Verwenden Sie zum Ausrichten nach rechts1.0
.Ich erweitere die ursprüngliche Detaillösung von @NAlexN mit der hervorragenden Erweiterung von @zekel
UITapGestureRecognizer
und der Bereitstellung in Swift .UITapGestureRecognizer erweitern
Verwendung
Setup
UIGestureRecognizer
zum Senden von Aktionen antapLabel:
und Sie können erkennen, ob die Zielbereiche aktiviert sindmyLabel
.WICHTIG: Der
UILabel
Zeilenumbruchmodus muss so eingestellt sein, dass er nach Wort / Zeichen umbrochen wird. IrgendwieNSTextContainer
wird davon ausgegangen, dass der Text nur dann eine einzelne Zeile ist, wenn der Zeilenumbruchmodus anders ist.quelle
targetRange1
undtargetRange2
.NSMutableAttributedString(attributedString: text)
dem ‚Text‘ ist einNSAttributedString
Alte Frage, aber wenn jemand a
UITextView
anstelle von a verwenden kannUILabel
, dann ist es einfach. Standard-URLs, Telefonnummern usw. werden automatisch erkannt (und können angeklickt werden).Wenn Sie jedoch eine benutzerdefinierte Erkennung benötigen, dh wenn Sie eine benutzerdefinierte Methode aufrufen möchten, nachdem ein Benutzer auf ein bestimmtes Wort geklickt hat, müssen Sie
NSAttributedStrings
einNSLinkAttributeName
Attribut verwenden, das auf ein benutzerdefiniertes URL-Schema verweist (im Gegensatz zu standardmäßig das http-URL-Schema haben). Ray Wenderlich hat es hier behandeltZitieren des Codes über den oben genannten Link:
Implementieren Sie Folgendes, um diese Linkklicks zu erkennen:
PS: Stellen Sie sicher, dass Sie
UITextView
istselectable
.quelle
Der UIButtonTypeCustom ist eine anklickbare Bezeichnung, wenn Sie keine Bilder dafür festlegen.
quelle
(Meine Antwort baut auf der hervorragenden Antwort von @ NAlexN auf . Ich werde seine ausführliche Erklärung zu jedem Schritt hier nicht wiederholen .)
Ich fand es am bequemsten und unkompliziertesten, UITapGestureRecognizer Unterstützung für tippbaren UILabel-Text als Kategorie hinzuzufügen. (Sie müssen die Datendetektoren von UITextView nicht verwenden, wie einige Antworten vermuten lassen.)
Fügen Sie Ihrer UITapGestureRecognizer-Kategorie die folgende Methode hinzu:
Beispielcode
Gestenrückruf
quelle
plainText.length
.UITapGestureRecognizer
. Hier finden Sie einige Informationen zum Hinzufügen von Kategorien.UITextView
unterstützt Datenerkenner in OS3.0,UILabel
nicht jedoch.Wenn Sie die Datenerkenner auf aktivieren
UITextView
und Ihr Text URLs, Telefonnummern usw. enthält, werden diese als Links angezeigt.quelle
hashtag://
oder so zuweisen und es dann verwendentextView(_:shouldInteractWith:in:interaction:)
, um es zu erkennen. Siehe die Antwort unten: stackoverflow.com/a/34014655/1161906Übersetzung von @ samwizes Erweiterung nach Swift 4:
So richten Sie den Erkenner ein (sobald Sie den Text und das Material eingefärbt haben):
... dann der Gestenerkenner:
quelle
didTapAttributedTextInLabel
braucht einNSRange
als Argument,rangeTerms
gibt aber etwas anderes zurück. Auch diehandleTapOnLabel
Funktion sollte@objc
in Swift 4 markiert werden.Wie ich in diesem Beitrag erwähnt habe , ist hier eine leichte Bibliothek, die ich speziell für Links in UILabel FRHyperLabel erstellt habe .
Um einen solchen Effekt zu erzielen:
Lorem ipsum dolor sitzen amet, consectetur adipiscing elit. Pellentesque quis blandit eros, sitzen amet vehicula justo. Nam bei Urna Neque. Maecenas ac sem eu sem porta dictum nec vel tellus.
Code verwenden:
quelle
Ich habe eine UILabel-Unterklasse mit dem Namen ResponsiveLabel erstellt, die auf der in iOS 7 eingeführten Textkit-API basiert. Sie verwendet denselben von NAlexN vorgeschlagenen Ansatz . Es bietet Flexibilität, um ein Muster anzugeben, das im Text gesucht werden soll. Man kann Stile angeben, die auf diese Muster angewendet werden sollen, sowie Aktionen, die beim Tippen auf die Muster ausgeführt werden sollen.
Wenn Sie eine Zeichenfolge anklickbar machen möchten, können Sie dies auf diese Weise tun. Dieser Code wendet Attribute auf jedes Vorkommen der Zeichenfolge "Text" an.
quelle
Arbeitete in Swift 3 und fügte hier den gesamten Code ein
quelle
Hier ist ein Beispielcode für den Hyperlink UILabel: Quelle: http://sickprogrammersarea.blogspot.in/2014/03/adding-links-to-uilabel.html
quelle
Hier ist eine schnelle Version der Antwort von NAlexN.
Sie können dann eine Instanz dieser Klasse in Ihrer
viewDidLoad
Methode wie folgt erstellen :Es ist besser, ein benutzerdefiniertes Attribut zu verwenden, wenn ein Zeichen getippt wird. Nun, es ist das
NSLinkAttributeName
, aber es könnte alles sein und Sie können diesen Wert verwenden, um andere Dinge als das Öffnen einer URL zu tun. Sie können jede benutzerdefinierte Aktion ausführen.quelle
Es fiel mir schwer, damit umzugehen ... UILabel mit Links zu zugeschriebenem Text ... es ist nur ein Kopfschmerz, also habe ich ZSWTappableLabel verwendet .
quelle
Wie bereits in früheren Antworten berichtet, kann UITextView Berührungen von Links verarbeiten. Dies kann leicht erweitert werden, indem andere Teile des Textes als Links verwendet werden. Die AttributedTextView-Bibliothek ist eine UITextView-Unterklasse, mit der diese sehr einfach zu handhaben sind. Weitere Informationen finden Sie unter: https://github.com/evermeer/AttributedTextView
Sie können jeden Teil des Textes wie folgt interagieren lassen (wobei textView1 ein UITextView IBOutlet ist):
Und für den Umgang mit Hashtags und Erwähnungen können Sie folgenden Code verwenden:
quelle
Ich erweitere die Antwort von @ samwize, um mehrzeiliges UILabel zu verarbeiten, und gebe ein Beispiel für die Verwendung für einen UIButton
quelle
Ich folge dieser Version,
Swift 4:
Anrufbeispiel:
quelle
Ich habe eine andere Lösung gefunden:
Ich finde eine Möglichkeit, den Link in einem HTML-Text zu erkennen, den Sie aus dem Internet finden. Sie wandeln ihn in nsattributeString um mit:
Mit meiner Methode können Sie den Hyperlink erkennen, ohne ihn angeben zu müssen.
Zuerst erstellen Sie eine Erweiterung des Tapgesturerecognizers:
}}
Anschließend haben Sie in Ihrem Ansichtscontroller eine Liste mit URLs und Bereichen erstellt, um alle Links und den Bereich zu speichern, den der Attributtext enthält:
So finden Sie die URL und den URLRange, die Sie verwenden können:
dann implementieren Sie den Handle Tap:
und es geht los!
Ich hoffe, diese Lösung hilft Ihnen, es gefällt mir.
quelle
Für vollständig benutzerdefinierte Links müssen Sie eine UIWebView verwenden. Sie können die Anrufe abfangen, sodass Sie stattdessen zu einem anderen Teil Ihrer App wechseln können, wenn ein Link gedrückt wird.
quelle
Hier ist eine Drop-In-Objective-C-Kategorie, die anklickbare Links in vorhandenen
UILabel.attributedText
Zeichenfolgen ermöglicht und das vorhandeneNSLinkAttributeName
Attribut ausnutzt .Dies wäre ein bisschen sauberer, wenn Sie eine UILabel-Unterklasse (dh keine der objc_getAssociatedObject-Nachrichten) verwenden. Wenn Sie jedoch wie ich sind, möchten Sie lieber keine unnötigen Unterklassen (von Drittanbietern) erstellen, um vorhandenen UIKit-Klassen zusätzliche Funktionen hinzuzufügen. Dies hat auch die Schönheit, dass es klickbare Links zu jedem vorhandenen UILabel hinzufügt, z. B. vorhanden
UITableViewCells
!Ich habe versucht, es so minimal invasiv wie möglich zu gestalten, indem ich das vorhandene
NSLinkAttributeName
Attributmaterial verwendet habe, das bereits in NSAttributedString verfügbar ist. So ist es einfach wie:Grundsätzlich funktioniert es, indem Sie
UIGestureRecognizer
Ihrem UILabel ein hinzufügen. Die harte Arbeit wird erledigtgestureRecognizerShouldBegin:
, indem die Attribut-Text-Zeichenfolge neu angeordnet wird, um herauszufinden, auf welches Zeichen getippt wurde. Wenn dieses Zeichen Teil eines NSLinkAttributeName war, wird der gestureRecognizer anschließend ausgelöst, die entsprechende URL (aus dem NSLinkAttributeName-Wert) abgerufen und der Link wie gewohnt geöffnet[UIApplication.sharedApplication openURL:url]
.Hinweis - indem Sie dies alles in tun
gestureRecognizerShouldBegin:
Wenn Sie dies nicht , wird das Ereignis weitergeleitet, wenn Sie nicht zufällig auf einen Link im Etikett tippen. So erfasst beispielsweise Ihre UITableViewCell Taps auf Links, verhält sich aber ansonsten normal (Zelle auswählen, Auswahl aufheben, scrollen, ...).Ich habe dies in einer GitHub - Repository setze hier . Adaptiert von Kai Burghardts SO-Posting hier .
quelle
Erstellen Sie die Klasse mit den folgenden .h- und .m-Dateien. In der .m-Datei gibt es die folgende Funktion
Innerhalb dieser Funktion überprüfen wir die Bereiche von Teilzeichenfolgen, für die wir Aktionen ausführen müssen. Verwenden Sie Ihre eigene Logik, um Ihre Bereiche zu setzen.
Und es folgt die Verwendung der Unterklasse
Es folgt die .h-Datei
Es folgt die .m-Datei
quelle
Ich würde dringend empfehlen, eine Bibliothek zu verwenden, die URLs im Text automatisch erkennt und in Links konvertiert. Versuchen:
Beide stehen unter MIT-Lizenz.
quelle
basierend auf der Antwort von Charles Gamble, die ich verwendet habe (ich habe einige Zeilen entfernt, die mich verwirrten und mir einen falschen Index gaben):
quelle
Drop-In-Lösung als Kategorie für
UILabel
(dies setzt voraus, dass SieUILabel
eine zugeordnete Zeichenfolge mit einigenNSLinkAttributeName
Attributen verwenden):quelle
Hier ist eine Swift-Implementierung, die so minimal wie möglich ist und auch Touch-Feedback enthält. Vorsichtsmaßnahmen:
"\u{a0}"
).link
Schlüsseln hinzufügen.
quelle
Diese generische Methode funktioniert auch!
Und Sie können die Methode mit aufrufen
quelle
UITapGestureRecognizer
? Ist es eine Steckdose? Eine Eigenschaft, die Sie einrichten?Hier ist meine Antwort basierend auf der Antwort von @Luca Davanzo . Überschreiben Sie das
touchesBegan
Ereignis anstelle einer Tippgeste :quelle
STICHWORTE # Swift2.0
Ich lasse mich von der Antwort von @ NAlexN inspirieren und entscheide mich, selbst einen Umschlag mit UILabel zu schreiben.
Ich habe auch TTTAttributedLabel ausprobiert aber ich kann es nicht zum bringen.
Ich hoffe, Sie können diesen Code schätzen, Vorschläge sind willkommen!
quelle
0
einelocationOfTouchInTextContainer.x
negative Ursache zurückgegeben . Ich versuchelet indexOfCharacter = layoutManager.glyphIndex(for: locationOfTouch, in: textContainer)
stattdessen zu verwenden und funktioniert gut.quelle
Der @ Timbroder-Code wurde geändert, um mehrere Zeilen für swift4.2 korrekt zu behandeln
UILabel-Code
Code zum Erkennen des Tap
quelle
Dies ist eine Xamarin.iOS c # -Implementierung, die auf Kedars Antwort basiert .
Implementierung von MyClickableTextViewWithCustomUrlScheme mit
ShouldInteractWithUrl
Überschreibung:Der konvertierte Ziel-C-Code in c # wird zu:
Stellen Sie sicher, dass Editable = false und Selectable = true festgelegt sind, um auf den Link klicken zu können.
Auch ScrollEnabled = true ermöglicht es der Textansicht, ihre Höhe korrekt zu dimensionieren.
quelle