Erstellen Tippen-können "links" in der NSAttributedString von UILabel?
Habe ich die Suche für diese Stunden, aber ich habe versagt. Ich wahrscheinlich gar nicht wissen, was ich suchen sollte.
Viele Anwendungen text und in diesem text sind web-hyperlinks in abgerundeten Rechteck. Wenn ich auf Sie UIWebView
öffnet. Was mich verwirrt ist, dass Sie oft von benutzerdefinierten links, wenn zum Beispiel Worte, die mit # beginnt, ist es auch anklickbar und die Anwendung reagiert durch öffnen einer anderen Ansicht. Wie kann ich das tun? Ist es möglich mit UILabel
oder brauche ich UITextView
oder etwas anderes?
Siehe: stackoverflow.com/questions/50505334/... für eine voll funktionsfähige
Swift 4
Lösung. Es nutzt UITextView
aber macht es sich wie ein UILabel
. Ich habe versucht, die Lösungen hier, und nicht um genaue link-Erkennung.InformationsquelleAutor Lope | 2009-08-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Allgemeinen, wenn wir wollen, haben einen anklickbaren link im text angezeigt, UILabel, würden wir uns auflösen müssen zwei unabhängige Aufgaben:
Die erste ist einfach. Ab iOS 6 UILabel unterstützt die Anzeige von strings zugeschrieben. Alles, was Sie tun müssen, ist zu erstellen und zu konfigurieren eine Instanz von NSMutableAttributedString:
Das ist es! Der code oben macht UILabel angezeigt String mit einem link
Nun sollten wir erkennen, berührt Sie auf diesen link. Die Idee ist, fangen alle Hähne in UILabel und herausfinden, ob die Lage der Tippen Sie nahe genug war, um den link. Zu fangen, berührt, können wir hinzufügen, Tippen Sie auf gesten-recognizer auf das Etikett. Stellen Sie sicher, dass userInteraction für das label, es ist standardmäßig deaktiviert:
Nun die raffiniertesten Sachen: herausfinden, ob der Hahn war auf, wo der link angezeigt wird und nicht auf irgendeinen anderen Teil des Etiketts. Wenn wir einzeiligem UILabel, diese Aufgabe gelöst werden könnte, relativ leicht durch hardcoding das Gebiet Grenzen, wo der link angezeigt wird, sondern wir lösen Sie dieses problem elegant und für den Allgemeinen Fall - multiline-UILabel, ohne Vorherige Kenntnisse über den link layout.
Einer der Ansätze ist die Verwendung von Funktionen von Text-Kit API in iOS eingeführt 7:
Speichern erstellt und konfiguriert werden, Instanzen von NSLayoutManager, NSTextContainer und NSTextStorage in den Eigenschaften in Ihrer Klasse (wahrscheinlich UIViewController Abkömmling) - wir müssen Sie auf andere Methoden.
Nun, jedes mal ändert sich die Beschriftung, Rahmen, update textContainer Größe:
Und schließlich erkennen, ob der Hahn war genau auf den link:
Wie würde ich das organisieren, diese in
cellForRowAtIndexPath
? Ich bin erstellen und konfigurieren von Instanzen innerhalbcellForRowAtIndexPath
- und hosting derhandleTapOnLabel
Funktion zu. Aber beicell.textLabel.addGestureRecognizer(UITapGestureRecognizer(target: cell, action: "handleTapOnLabel:"))
ich bin immerunrecognized selector
.Diese Lösung wird davon ausgegangen, dass die Bezeichnung
textAlignment
AttributNSTextAlignmentCenter
. Wenn Sie mit nicht-zentrierter text, passen Sie die Berechnung IhrertextContainerOffset
im obigen code.Bei der Berechnung der
x
Wert vontextContainerOffset
die Konstante0.5
verwendet wird. Dieser errechnet die richtige position fürNSTextAlignmentCenter
. Ausrichten Links, natürlichen oder gerechtfertigt, einen Wert von0.0
. Nach rechts ausrichten verwenden Sie1.0
.Es funktioniert bei mir auch, aber nur für eine einzige Zeile der Bezeichnung. Wenn Label enthalten mehr als 1 Zeile wird dann diese Methode funktioniert nicht richtig. Kann jemand sagen, dass er zur Durchführung derselben Aufgabe mit mehreren Linien
InformationsquelleAutor NAlexN
Ich bin Verlängerung @NAlexN original-detaillierte Lösung, mit @zekel hervorragende Erweiterung der
UITapGestureRecognizer
und bietet in Swift.Erweitern UITapGestureRecognizer
Nutzung
Setup
UIGestureRecognizer
zu senden Aktionen zutapLabel:
, und Sie können erkennen, ob die Zielgruppe reicht ist ausgeschöpft inmyLabel
.WICHTIG: Die
UILabel
Zeilenumbruch-Modus muss eingestellt werden, um wrap-für-Wort/Buchstabe. IrgendwieNSTextContainer
davon aus, dass der text ist eine einzige Zeile nur, wenn der line-break-Modus ist anders.Ich fügte hinzu, ein Beispiel für multi-line-unten
Funktioniert das mit den Etiketten mit mehreren links?
Es funktioniert nicht
Für alle, die noch Probleme mit mehreren Linien oder falsche Reihe auftreten, setzen Sie Ihre UILabel zu Zurückgeführt, so dass Zeilenumbruch, und legen Sie die zugeschriebenen text des Labels zu
NSMutableAttributedString(attributedString: text)
wo "text" ist einNSAttributedString
InformationsquelleAutor samwize
Den UIButtonTypeCustom ist ein anklickbares label, wenn Sie nicht alle Bilder.
InformationsquelleAutor Iggy
(Meine Antwort baut auf @NAlexN ist ausgezeichnete Antwort. Ich werde nicht duplizieren seine ausführliche Erklärung der einzelnen Schritte hier.)
Ich fand es die meisten bequem und unkompliziert zum hinzufügen von Unterstützung für tap-in der Lage UILabel text als eine Kategorie zu UITapGestureRecognizer. (Sie müssen nicht haben Verwendung UITextView die Daten der Detektoren, wie einige Antworten vorschlagen.)
Fügen Sie die folgende Methode, um Ihre UITapGestureRecognizer Kategorie:
Beispiel-Code
Geste Callback -
Hoppla, das war ein Fehler. Das sollte die start-index-der link-text, in diesem Beispiel sollte es
plainText.length
.Fehler in CGPoint locationOfTouchInLabel = [self locationInView:label];
Ich danke Ihnen sehr, mich für diese Lösung. Aber könntest du erklären, was genau du meinst mit "Fügen Sie die folgende Methode, um Ihre UITapGestureRecognizer Kategorie"? Nicht sicher, was ich tun sollte hier.
Sie können Kategorien hinzufügen, um Methoden zu vorhandenen Klassen, die nützlich für die Arbeit mit Klassen, die Sie nicht geschrieben, wie
UITapGestureRecognizer
. Hier ist info auf hinzufügen Kategorien.InformationsquelleAutor zekel
Alte Frage, aber wenn jemand kann ein
UITextView
statt einerUILabel
, dann ist es einfach. Standard-URLs, Telefonnummern etc. werden automatisch erkannt (und anklickbar).Aber, wenn Sie benutzerdefinierte Erkennung, das heißt, wenn Sie in der Lage sein wollen, rufen Sie eine benutzerdefinierte Methode auf, nachdem ein Benutzer klickt auf ein bestimmtes Wort verwenden, benötigen Sie
NSAttributedStrings
mit einemNSLinkAttributeName
Attribut, das eine benutzerdefinierte URL-Schema(im Gegensatz zu den http-url-Schema standardmäßig). Ray Wenderlich hat es hier behandeltAngabe des Codes aus dem oben genannten link:
Erkennen diesen link klickt, dies umzusetzen:
PS: Stellen Sie sicher, dass Ihre
UITextView
istselectable
.Das problem mit diesem ist, wenn Sie wollen, um es Generika für verschiedene links, die Sie haben, zu überprüfen, was ist die URL, die entsprechenden Maßnahmen zu ergreifen
InformationsquelleAutor Kedar Paranjape
UITextView
unterstützt Daten-Detektoren in OS3.0, in der Erwägung, dassUILabel
nicht.Aktivieren Sie die Daten-Detektoren auf der
UITextView
Ihr text enthält URLs, Telefonnummern, usw.. Sie werden als links angezeigt.Können Sie noch heute tun, nur weisen Sie eine benutzerdefinierte url-Schema wie
hashtag://
oder so, dann verwenden SietextView(_:shouldInteractWith:in:interaction:)
zu erkennen. Siehe die Antwort weiter unten: stackoverflow.com/a/34014655/1161906InformationsquelleAutor Charles Gamble
Übersetzen @samwize Erweiterung der Swift 4:
Einrichten der recognizer (sobald Sie farbigen text und Zeug):
...dann die gestik-Erkennung:
didTapAttributedTextInLabel
muss einNSRange
als argument aberrangeTerms
gibt etwas anderes. Auch diehandleTapOnLabel
Funktion markiert werden soll, mit@objc
im Swift 4.Hi @peacetype, das ist wahr, ich bin das Hinzufügen einer Erforderlichen Verlängerung....
InformationsquelleAutor Hernan Arber
Als ich bereits in der dieser Beitrag,
hier ist ein leichtes Bibliothek, die ich eigens für links in UILabel FRHyperLabel.
Einen Effekt erzielen wie diese:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque quis blandit eros, sit amet vehicula justo. Nam in urna neque. Mäzen ac-rem eu-rem porta dictum nec vel tellus.
code verwenden:
Funktioniert gut auf Swift 4 auch.
Herrlich! 😀 thx
InformationsquelleAutor Jinghan Wang
Ich erstellt UILabel Unterklasse namens ResponsiveLabel basierend auf textkit API in iOS eingeführt 7. Es verwendet den gleichen Ansatz vorgeschlagen, durch NAlexN. Es bietet Flexibilität, um ein Muster angeben, um die Suche im text. Kann man angeben, Stile angewandt werden, um diese Muster als auch als Aktion, die ausgeführt werden auf die Erschließung der Muster.
Wenn Sie wollen, um einen string anklickbar, die Sie tun können, auf diese Weise. Dieser code gilt für Attribute, die für jedes vorkommen der Zeichenkette "text".
Jetzt, ResponsiveLabel keine Methode nimmt ein array von string-und macht Sie klickbar. Sie können erstellen Sie einen Fehlerbericht senden und ich werde dies umsetzen bald.
Ja, es ist nicht ein Problem, aber diese Methode array.
Eines der besten Lösung. Solide Arbeit!
InformationsquelleAutor hsusmita
Arbeitete in Swift 3, kopieren Sie den gesamten code hier
Du meinst iOS 10 😉
InformationsquelleAutor Naishta
Hier ist der Beispiel-code, hyperlink UILabel:
Quelle:http://sickprogrammersarea.blogspot.in/2014/03/adding-links-to-uilabel.html
InformationsquelleAutor Santosh
Hier ist eine schnelle version von NAlexN Antwort.
}
Können Sie dann erstellen Sie eine Instanz der Klasse in Ihrem
viewDidLoad
Methode wie diese:Es ist besser, ein benutzerdefiniertes Attribut zu verwenden, wenn ein Charakter getappt. Nun, es ist die
NSLinkAttributeName
, aber könnte alles sein und Sie können diesen Wert verwenden, um andere Dinge tun zu öffnen ein url ist, können Sie eine benutzerdefinierte Aktion.Sie dürfen shouldRecognizeSimultaneously developer.apple.com/documentation/uikit/...
InformationsquelleAutor mohamede1945
Wie es berichtet wird, in früheren awnser der UITextView ist in der Lage, Berührungen auf links. Dies kann leicht erweitert werden, indem andere Teile der text-links. Die AttributedTextView Bibliothek ist ein UITextView-Unterklasse, die macht es sehr einfach zu handhaben. Für mehr info siehe: https://github.com/evermeer/AttributedTextView
Können Sie irgendein Teil des Textes zu interagieren, wie diese (wo textView1 ist ein UITextView IBoutlet):
Sowie für das handling von hashtags und Erwähnungen können Sie code wie diesen:
InformationsquelleAutor Edwin Vermeer
Ich hatte eine harte Zeit den Umgang mit diesem... UILabel mit links auf Sie zurückzuführen text... es ist nur ein Kopfschmerz, so landete ich mit ZSWTappableLabel.
InformationsquelleAutor Oscar Salguero
Ich bin die Ausweitung @samwize Antwort zu behandeln multi-line-UILabel und ein Beispiel geben über die Verwendung für einen UIButton
haben Sie benutzerdefinierte Schriftarten und Zeilenabstände?
nicht wirklich, verwenden wir die schriftart HelveticaNeue und Höhen standard
nicht funktionieren wenn der Zeilenumbruch nicht auf den rechten Rand des Etiketts
InformationsquelleAutor timbroder
Vollständig benutzerdefinierte links, werden Sie brauchen, um eine UIWebView - Sie können das abfangen der Anrufe, so dass Sie gehen können, um einen anderen Teil der app statt, wenn ein link gedrückt wird.
InformationsquelleAutor Kendall Helmstetter Gelner
Hier ist ein drop-in Objective-C-Kategorie, die es ermöglicht, Verknüpfungen in vorhandene
UILabel.attributedText
strings, die Nutzung der vorhandenenNSLinkAttributeName
Attribut.Wäre dies ein bisschen sauberer gemacht über ein UILabel-Unterklasse, (also keiner der objc_getAssociatedObject Durcheinander), aber wenn Sie wie ich sind, bevorzugen Sie zu vermeiden, dass unnötig machen (3rd party) Unterklassen nur hinzufügen, dass einige zusätzliche Funktion für vorhandene UIKit-Klassen. Auch das hat der Schönheit, es fügt klickbare-links zu alle bestehenden UILabel, z.B. vorhandene
UITableViewCells
!Ich habe versucht, es als minimal-invasive wie möglich mit der vorhandenen
NSLinkAttributeName
Attribut Sachen, die bereits im NSAttributedString. So eine einfache wie:Grundsätzlich funktioniert es durch hinzufügen einer
UIGestureRecognizer
zu Ihrem UILabel. Die harte Arbeit ist getan ingestureRecognizerShouldBegin:
, die re-layouts, die attributedText string, um herauszufinden, welcher Charakter war tippte auf. Wenn dieser Charakter war Teil eines NSLinkAttributeName dann die gestureRecognizer anschließend Feuer, rufen Sie die entsprechende URL (aus der NSLinkAttributeName Wert), und öffnen Sie den link pro die üblichen[UIApplication.sharedApplication openURL:url]
Prozess.Beachten - indem Sie all diese in
gestureRecognizerShouldBegin:
, wenn Sie nicht zufällig Tippen Sie auf einen link in der Bezeichnung der Veranstaltung weitergegeben wird. So, zum Beispiel, Ihre UITableViewCell zu erfassen tippt auf links, aber ansonsten Verhalten sich normal (wählen Sie die Zelle, deaktivieren, scrollen, ...).Ich habe diese in einem GitHub-repository hier.
Adaptiert von Kai Burghardt ist SO posting hier.
InformationsquelleAutor tiritea
Folge ich dieser version,
Swift 4:
Aufruf Beispiel:
InformationsquelleAutor Sazzad Hissain Khan
Erstellen der Klasse mit dem folgenden .h und .m-Dateien. In der .m-Datei gibt es die folgende Funktion
In dieser Funktion prüfen wir die Bereiche von Zeichenketten, für die brauchen wir, um Aktionen. Verwenden Sie Ihre eigene Logik, um Ihre Bereiche.
Und folgende ist die Verwendung der Unterklasse
folgenden ist die .h-Datei
folgenden ist die .m-Datei
InformationsquelleAutor jjpp
Würde ich dringend empfehlen, über eine Bibliothek, die automatisch erkennt URLs in einem text und wandelt diese in links.
Versuchen:
Beide stehen unter MIT-Lizenz.
InformationsquelleAutor Lukasz Czerwinski
basierend auf Charles Zocken Antwort, das was ich benutzt habe (habe ich entfernt, einige Linien, das verwirrt mich und gab mir falsch indiziert) :
InformationsquelleAutor user1105951
Hier ist eine schnelle Umsetzung, ist ungefähr so minimal, wie möglich, das auch touch-feedback. Vorsichtsmaßnahmen:
"\u{a0}"
).link
Schlüssel.
InformationsquelleAutor mxcl
Diese generische Methode funktioniert auch !
Und Sie können rufen Sie die Methode mit
InformationsquelleAutor Naishta
Ich fand eine andere Lösung:
Finde ich einen Weg zu erkennen, den link in einem html-text, den Sie finden aus dem internet, verwandeln Sie es in nsattributeString mit :
Meine Methode erlaubt Ihnen zu erkennen, die den hyperlink, die zimmerreserviereung, ohne das Sie angeben.
erstellen Sie zunächst eine Verlängerung der tapgesturerecognizer :
}
dann in Sie view-controller erstellt eine Liste von url-und-Bereiche zu speichern, die links und das Angebot, das Attribut text enthalten:
finden Sie die URL und die URLRange die Sie verwenden können :
dann implementieren Sie den Griff drücken :
und hier gehen wir!
Ich hoffe diese Lösung hilft Euch wie es mir helfen.
InformationsquelleAutor Jeremy Vandermeersch
TAGS #Swift2.0
Nehme ich inspiration auf die - hervorragende - @NAlexN Antwort und ich entscheiden, zu schreiben, indem Sie mir einen wrapper UILabel.
Ich habe auch versucht TTTAttributedLabel aber ich kann nicht machen es funktioniert.
Hoffe, Sie schätzen diesen code, alle Vorschläge sind willkommen!
0
Ursache, dasslocationOfTouchInTextContainer.x
war negativ. Ich versuche es mal mitlet indexOfCharacter = layoutManager.glyphIndex(for: locationOfTouch, in: textContainer)
statt, und funktioniert gut.InformationsquelleAutor Luca Davanzo
Drop-in-Lösung als eine Kategorie
UILabel
(dies setzt Voraus, IhreUILabel
verwendet zugeschrieben string mit einigenNSLinkAttributeName
Attribute):InformationsquelleAutor Pol
Hier ist meine Antwort auf @Luca Davanzo ist Antwort, überschreiben Sie die
touchesBegan
Ereignis statt einer tap-Geste:InformationsquelleAutor HamGuy
InformationsquelleAutor user3044484
cant erklären deine Frage ???
Ereignis, obwohl es eine Frage, deine ANTWORT sollte enthalten einige Erläuterungen zum code. Damit wäre deine Antwort besser. Wahrscheinlich würden Sie einige up-votes 😉
InformationsquelleAutor Ankit Goyal