Il est trivial de rendre les hyperliens cliquables dans un fichier UITextView
. Vous venez de définir la case à cocher "détecter les liens" sur la vue dans IB, et il détecte les liens HTTP et les transforme en hyperliens.
Cependant, cela signifie toujours que ce que l'utilisateur voit est le lien "brut". Les fichiers RTF et HTML vous permettent tous les deux de configurer une chaîne lisible par l'utilisateur avec un lien "derrière".
Il est facile d'installer du texte attribué dans une vue de texte (ou un UILabel
ou UITextField
, d'ailleurs.) Cependant, lorsque ce texte attribué comprend un lien, il n'est pas cliquable.
Existe-t-il un moyen de rendre le texte lisible par l'utilisateur cliquable dans un UITextView
, UILabel
ou UITextField
?
Le balisage est différent sur SO, mais voici l'idée générale. Ce que je veux, c'est un texte comme celui-ci:
Ce morph a été généré avec Face Dancer , Cliquez pour voir dans l'App Store.
La seule chose que je puisse obtenir est la suivante:
Cette évolution a été générée avec Face Dancer, cliquez sur http://example.com/facedancer pour l'afficher dans l'App Store.
Réponses:
Utilisez NSMutableAttributedString .
Modifier :
Il ne s'agit pas directement de la question mais simplement pour clarifier
UITextField
etUILabel
ne prend pas en charge l'ouverture d'URL. Si vous souhaitez utiliserUILabel
des liens, vous pouvez vérifier TTTAttributedLabel .Aussi , vous devez définir la
dataDetectorTypes
valeur de votreUITextView
àUIDataDetectorTypeLink
ouUIDataDetectorTypeAll
à ouvrir des URL lorsque vous cliquez dessus. Ou vous pouvez utiliser la méthode déléguée comme suggéré dans les commentaires.la source
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
NSURL
. ----[str addAttribute: NSLinkAttributeName value: [NSURL URLWithString:@"http://www.google.com"] range: NSMakeRange(0, str.length)];
NSAttributedString.h
UIKIT_EXTERN NSString * const NSLinkAttributeName NS_AVAILABLE(10_0, 7_0); // NSURL (preferred) or NSString
J'ai trouvé cela vraiment utile, mais je devais le faire à plusieurs endroits, j'ai donc enveloppé mon approche dans une simple extension pour
NSMutableAttributedString
:Swift 3
Swift 2
Exemple d'utilisation:
Objectif c
Je viens de rencontrer une exigence de faire de même dans un projet Objective-C pur, alors voici la catégorie Objective-C.
Exemple d'utilisation:
Assurez-vous que l'attribut Comportement de NSTextField est défini comme sélectionnable.
la source
Je viens de créer une sous-classe d'UILabel pour répondre spécifiquement à ces cas d'utilisation. Vous pouvez facilement ajouter plusieurs liens et définir pour eux différents gestionnaires. Il prend également en charge la mise en surbrillance du lien enfoncé lorsque vous touchez pour un retour tactile. Veuillez vous référer à https://github.com/null09264/FRHyperLabel .
Dans votre cas, le code peut ressembler à ceci:
Exemple de capture d'écran (le gestionnaire est configuré pour déclencher une alerte au lieu d'ouvrir une URL dans ce cas)
la source
- (void)setLinkForRange:(NSRange)range withLinkHandler:(void(^)(FRHyperLabel *label, NSRange selectedRange))handler;
place. Veuillez vous référer au fichier Lisezmoi de la page github.Amélioration mineure de la solution d'ujell: si vous utilisez NSURL au lieu d'une chaîne NSString, vous pouvez utiliser n'importe quelle URL (par exemple des URL personnalisées)
S'amuser!
la source
Swift 4:
Swift 3.1:
la source
Moi aussi, j'avais une exigence similaire, j'ai d'abord utilisé UILabel, puis j'ai réalisé que UITextView était mieux. J'ai fait UITextView se comporter comme UILabel en désactivant l'interaction et le défilement et j'ai créé une méthode de catégorie pour
NSMutableAttributedString
définir le lien vers le texte comme ce que Karl avait fait (+1 pour cela) c'est ma version obj cvous pouvez ensuite utiliser le délégué ci-dessous pour gérer l'action
la source
NSForegroundColorAttributeName
dans une plage oùNSLinkAttributeName
est appliqué ne fonctionne pas. Quoi qu'il en soit, leslinkTextAttributes
duUITextView
sont appliqués à la place. ÇaNSForegroundColorAttributeName
marche pour vous?linkTextAttributes
pas la même chose? ou peuttintColor
- être ? Pouvez-vous faire apparaître 2 liens de différentes couleurs dans la même vue de texte?Utilisez UITextView, il prend en charge les liens cliquables. Créez une chaîne attribuée en utilisant le code suivant
Ensuite, définissez le texte UITextView comme suit
Assurez-vous que vous activez le comportement "sélectionnable" de l'UITextView dans XIB.
la source
Selectable
est importante!Le cœur de ma question était que je voulais pouvoir créer des liens cliquables dans les vues / champs / étiquettes de texte sans avoir à écrire du code personnalisé pour manipuler le texte et ajouter les liens. Je voulais que ce soit basé sur les données.
J'ai finalement compris comment le faire. Le problème est que IB n'honore pas les liens intégrés.
De plus, la version iOS de
NSAttributedString
ne vous permet pas d'initialiser une chaîne attribuée à partir d'un fichier RTF. La version OS X deNSAttributedString
possède un initialiseur qui prend un fichier RTF en entrée.NSAttributedString
est conforme au protocole NSCoding, vous pouvez donc le convertir vers / depuis NSDataJ'ai créé un outil de ligne de commande OS X qui prend un fichier RTF en entrée et génère un fichier avec l'extension .data qui contient le NSData de NSCoding. J'ai ensuite mis le fichier .data dans mon projet et ajouté quelques lignes de code qui chargent le texte dans la vue. Le code ressemble à ceci (ce projet était en Swift):
Pour les applications qui utilisent beaucoup de texte formaté, je crée une règle de construction qui indique à Xcode que tous les fichiers .rtf d'un dossier donné sont source et que les fichiers .data sont la sortie. Une fois que je fais cela, j'ajoute simplement des fichiers .rtf au répertoire désigné (ou modifie les fichiers existants) et le processus de construction détermine qu'ils sont nouveaux / mis à jour, exécute l'outil de ligne de commande et copie les fichiers dans le bundle d'application. Cela fonctionne à merveille.
J'ai écrit un article de blog qui renvoie à un exemple de projet (Swift) démontrant la technique. Tu peux le voir ici:
Création d'URL cliquables dans un UITextField qui s'ouvrent dans votre application
la source
Exemple Swift 3 pour détecter les actions sur les tapotements de texte attribués
https://stackoverflow.com/a/44226491/5516830
Comme sage, vous pouvez ajouter n'importe quelle action que vous souhaitez avec la
shouldInteractWith URL
méthode UITextFieldDelegate.À votre santé!!
la source
La réponse rapide utilise UITextView au lieu de UILabel. Vous devez activer
Selectable
et désactiverEditable
.Désactivez ensuite les indicateurs de défilement et les rebonds.
Ma solution en utilisant une
NSMutableAttributedString
chaîne htmlNSHTMLTextDocumentType
la source
NSAttributedString
, le définir comme leattributedText
monUITextView
et les hyperliens fonctionnent! Il aurait fallu beaucoup de travail pour trouver la plage de chaque hyperlien et le configurer à l'aide d'attributs.J'ai écrit une méthode, qui ajoute un lien (linkString) à une chaîne (fullString) avec une certaine URL (urlString):
Vous devriez l'appeler comme ceci:
la source
Je devais continuer à utiliser un UILabel pur, ainsi appelé à partir de mon identificateur de prise (cela est basé sur la réponse de malex ici: Index des caractères au point de contact pour UILabel )
la source
Mettre à jour:
Ma question comportait 2 éléments clés:
Il s'avère qu'iOS 7 a ajouté la possibilité de charger le texte attribué à partir de
NSData
.J'ai créé une sous-classe personnalisée
UITextView
qui tire parti de l'@IBInspectable
attribut et vous permet de charger le contenu d'un fichier RTF directement dans IB. Vous tapez simplement le nom de fichier dans IB et la classe personnalisée fait le reste.Voici les détails:
Dans iOS 7, a
NSAttributedString
gagné la méthodeinitWithData:options:documentAttributes:error:
. Cette méthode vous permet de charger un NSAttributedString à partir d'un objet NSData. Vous pouvez d'abord charger un fichier RTF dans NSData, puis l'utiliserinitWithData:options:documentAttributes:error:
pour charger ce NSData dans votre vue texte. (Notez qu'il existe également une méthodeinitWithFileURL:options:documentAttributes:error:
qui chargera une chaîne attribuée directement à partir d'un fichier, mais cette méthode a été déconseillée dans iOS 9. Il est plus sûr d'utiliser la méthodeinitWithData:options:documentAttributes:error:
, qui n'était pas déconseillée.Je voulais une méthode qui me permette d'installer des liens cliquables dans mes vues de texte sans avoir à créer de code spécifique aux liens que j'utilisais.
La solution que j'ai trouvée était de créer une sous-classe personnalisée de UITextView que j'appelle
RTF_UITextView
et de lui donner une@IBInspectable
propriété appeléeRTF_Filename
. L'ajout de l'@IBInspectable
attribut à une propriété oblige Interface Builder à exposer cette propriété dans «l'inspecteur d'attributs». Vous pouvez ensuite définir cette valeur à partir d'IB sans code personnalisé.J'ai également ajouté un
@IBDesignable
attribut à ma classe personnalisée. L'@IBDesignable
attribut indique à Xcode qu'il doit installer une copie en cours d'exécution de votre classe de vue personnalisée dans le générateur d'interface afin que vous puissiez la voir dans l'affichage graphique de votre hiérarchie de vues. () Malheureusement, pour cette classe, la@IBDesignable
propriété semble floconneuse. Cela a fonctionné lorsque je l'ai ajouté pour la première fois, mais j'ai ensuite supprimé le contenu en texte brut de mon affichage de texte et les liens cliquables de mon affichage ont disparu et je n'ai pas pu les récupérer.)Le code pour my
RTF_UITextView
est très simple. En plus d'ajouter l'@IBDesignable
attribut et uneRTF_Filename
propriété avec l'@IBInspectable
attribut, j'ai ajouté unedidSet()
méthode à laRTF_Filename
propriété. LadidSet()
méthode est appelée à chaque fois que la valeur de laRTF_Filename
propriété change. Le code de ladidSet()
méthode est assez simple:Notez que si la propriété @IBDesignable ne vous permet pas de prévisualiser de manière fiable votre texte stylisé dans le générateur d'interface, il peut être préférable de définir le code ci-dessus comme une extension de UITextView plutôt qu'une sous-classe personnalisée. De cette façon, vous pouvez l'utiliser dans n'importe quelle vue de texte sans avoir à changer la vue de texte en classe personnalisée.
Voir mon autre réponse si vous devez prendre en charge les versions iOS avant iOS 7.
Vous pouvez télécharger un exemple de projet qui inclut cette nouvelle classe depuis gitHub:
Projet de démonstration DatesInSwift sur Github
la source
Trouvez simplement une solution sans code pour UITextView:
Activez les options Détection-> Liens, l'URL et également le courrier électronique seront détectés et cliquables!
la source
Version rapide:
la source
Utilisez UITextView et définissez dataDetectorTypes pour Link.
comme ça:
Si vous souhaitez détecter un lien, un numéro de téléphone, une adresse, etc., puis
la source
http://somedomain/someurl?param=value
Un ajout rapide à la description originale de Duncan C vis-à-vis du comportement de l'IB. Il écrit: "Il est trivial de rendre les hyperliens cliquables dans un UITextView. Vous venez de définir la case" détecter les liens "sur la vue dans IB, et il détecte les liens http et les transforme en hyperliens."
Mon expérience (au moins dans xcode 7) est que vous devez également décocher le comportement "Modifiable" pour que les URL soient détectées et cliquables.
la source
Si vous rencontrez des problèmes avec ce que @Karl Nosworthy et @esilver ont fourni ci-dessus, j'ai mis à jour l'extension NSMutableAttributedString vers sa version Swift 4.
la source
L'excellente bibliothèque de @AliSoftware
OHAttributedStringAdditions
facilite l'ajout de liensUILabel
ici est la documentation: https://github.com/AliSoftware/OHAttributedStringAdditions/wiki/link-in-UILabella source
Si vous souhaitez utiliser NSLinkAttributeName dans un UITextView, vous pouvez envisager d'utiliser la bibliothèque AttributedTextView. Il s'agit d'une sous-classe UITextView qui facilite leur gestion. Pour plus d'informations, voir: https://github.com/evermeer/AttributedTextView
Vous pouvez faire en sorte que n'importe quelle partie du texte interagisse comme ceci (où textView1 est un IBoutlet UITextView):
Et pour gérer les hashtags et les mentions, vous pouvez utiliser du code comme celui-ci:
la source
si vous voulez une sous-chaîne active dans votre UITextView, vous pouvez utiliser mon TextView étendu ... c'est court et simple. Vous pouvez le modifier comme vous le souhaitez.
résultat:
code: https://github.com/marekmand/ActiveSubstringTextView
la source
POINTS CLÉS:
la source