Je viens d'ajouter votre extension à mon projet! THX!
Zeb
Belle catégorie pour UILabel. Merci beaucoup. Cela devrait être la réponse acceptée.
Pradeep Reddy Kypa
63
J'ai fait cela en créant un categorypourNSMutableAttributedString
-(void)setColorForText:(NSString*) textToFind withColor:(UIColor*) color
{NSRange range =[self.mutableString rangeOfString:textToFind options:NSCaseInsensitiveSearch];if(range.location !=NSNotFound){[self addAttribute:NSForegroundColorAttributeNamevalue:color range:range];}}
Utilisez-le comme
-(void) setColoredLabel
{NSMutableAttributedString*string=[[NSMutableAttributedString alloc] initWithString:@"Here is a red blue and green text"];[string setColorForText:@"red" withColor:[UIColor redColor]];[string setColorForText:@"blue" withColor:[UIColor blueColor]];[string setColorForText:@"green" withColor:[UIColor greenColor]];
mylabel.attributedText =string;}
func setColoredLabel(){letstring=NSMutableAttributedString(string:"Here is a red blue and green text")string.setColorForText("red",with:#colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1))string.setColorForText("blue",with:#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1))string.setColorForText("green",with:#colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1))
mylabel.attributedText =string}
SWIFT 4 @ kj13 Merci de l'avoir notifié
// If no text is send, then the style will be applied to full text
func setColorForText(_ textToFind:String?,with color:UIColor){let range:NSRange?iflet text = textToFind{
range =self.mutableString.range(of: text, options:.caseInsensitive)}else{
range =NSMakeRange(0,self.length)}if range!.location !=NSNotFound{
addAttribute(NSAttributedStringKey.foregroundColor,value: color, range: range!)}}
J'ai fait plus d'expériences avec les attributs et ci-dessous sont les résultats, voici le SOURCECODE
Vous devez créer une nouvelle catégorie pour NSMutableAttributedString avec la méthode ... de toute façon, j'ai ajouté cet exemple à github, vous pouvez le récupérer et le vérifier github.com/anoop4real/NSMutableAttributedString-Color
anoop4real
Mais j'ai besoin de définir la couleur de tous les alphabets avec incasensitive dans une chaîne .... comme tous les "e" dans la couleur rouge de la chaîne entière
Ravi Ojha
Aucune @interface visible pour 'NSMutableAttributedString' déclare le sélecteur 'setColorForText: withColor:'
ekashking
1
J'ai eu l'erreur «Utilisation de l'identificateur non résolu« NSForegroundColorAttributeName »avec Swift4.1, mais je remplace« NSForegroundColorAttributeName »par« NSAttributedStringKey.foregroundColor »et je construis correctement.
kj13
1
@ kj13 Merci d'avoir averti, j'ai mis à jour la réponse et ajouté quelques styles supplémentaires
//NSString *myString = @"I have to replace text 'Dr Andrew Murphy, John Smith' ";NSString*myString =@"Not a member?signin";//Create mutable string from original oneNSMutableAttributedString*attString =[[NSMutableAttributedString alloc] initWithString:myString];//Fing range of the string you want to change colour//If you need to change colour in more that one place just repeat itNSRange range =[myString rangeOfString:@"signin"];[attString addAttribute:NSForegroundColorAttributeNamevalue:[UIColor colorWithRed:(63/255.0) green:(163/255.0) blue:(158/255.0) alpha:1.0] range:range];//Add it to the label - notice its not text property but it's attributeText
_label.attributedText = attString;
Il vous suffit de créer votre fichier NSAttributedString. Il existe essentiellement deux façons:
Ajoutez des morceaux de texte avec les mêmes attributs - pour chaque partie, créez une NSAttributedStringinstance et ajoutez-les à uneNSMutableAttributedString
Créez un texte attribué à partir d'une chaîne simple, puis ajoutez un attribut pour des plages données - trouvez la plage de votre numéro (ou autre) et appliquez un attribut de couleur différent à cela.
Avoir un UIWebView ou plus d'un UILabel pourrait être considéré comme excessif pour cette situation.
Ma suggestion serait d'utiliser TTTAttributedLabel, qui remplace UILabel qui prend en charge NSAttributedString . Cela signifie que vous pouvez très facilement appliquer différents styles à différentes plages d'une chaîne.
Pour afficher du texte court et formaté qui n'a pas besoin d'être modifiable, Core Text est la voie à suivre. Il existe plusieurs projets open source pour les étiquettes qui utilisent NSAttributedStringet Core Text pour le rendu. Voir CoreTextAttributedLabel ou OHAttributedLabel par exemple.
JTAttributedLabel (par mystcolor) vous permet d'utiliser le support des chaînes attribuées dans UILabel sous iOS 6 et en même temps sa classe JTAttributedLabel sous iOS 5 via son JTAutoLabel.
Salut, comment puis-je faire cela si je veux ajouter deux colorStrings différents? J'ai essayé d'utiliser votre exemple et d'en ajouter un autre, mais cela ne colore que l'un d'entre eux.
Erik Auranaune
Essayez ceci: let colorString = "(string in red)" let colorStringGreen = "(string in green)" self.mLabel.text = "classic color" + colorString + colorStringGreen self.mLabel.setSubTextColor (pSubString: colorString, pColor: UIColor .red) self.mLabel.setSubTextColor (pSubString: colorStringGreen, pColor: UIColor.green)
Un problème est que si les deux chaînes sont identiques, cela ne colore qu'une seule d'entre elles, regardez ici: pastebin.com/FJZJTpp3 . Vous avez une solution pour cela aussi?
Erik Auranaune
2
Swift 4 et supérieur: Inspiré de la solution anoop4real , voici une extension String qui peut être utilisée pour générer du texte avec 2 couleurs différentes.
Ma réponse a également la possibilité de colorer toutes les occurrences d'un texte non seulement une occurrence de celui-ci: "wa ba wa ba dubdub", vous pouvez colorier toutes les occurrences de wa non seulement la première occurrence comme la réponse acceptée.
extension NSMutableAttributedString{
func setColorForText(_ textToFind:String,with color:UIColor){let range =self.mutableString.range(of: textToFind, options:.caseInsensitive)if range.location !=NSNotFound{
addAttribute(NSForegroundColorAttributeName,value: color, range: range)}}
func setColorForAllOccuranceOfText(_ textToFind:String,with color:UIColor){let inputLength =self.string.count
let searchLength = textToFind.count
var range =NSRange(location:0, length:self.length)while(range.location !=NSNotFound){
range =(self.stringasNSString).range(of: textToFind, options:[], range: range)if(range.location !=NSNotFound){self.addAttribute(NSForegroundColorAttributeName,value: color, range:NSRange(location: range.location, length: searchLength))
range =NSRange(location: range.location + range.length, length: inputLength -(range.location + range.length))}}}}
Vous pouvez maintenant faire ceci:
let message =NSMutableAttributedString(string:"wa ba wa ba dubdub")
message.setColorForText(subtitle,with:UIColor.red)// or the below one if you want all the occurrence to be colored
message.setColorForAllOccuranceOfText("wa",with:UIColor.red)// then you set this attributed string to your label :
lblMessage.attributedText = message
Mis à jour ma réponse, passez une bonne journée :)
compilateur Alsh
1
Pour les utilisateurs de Xamarin , j'ai un C # statique méthode laquelle je passe un tableau de chaînes, un tableau d'UIColours et un tableau d'UIFont (ils devront correspondre en longueur). La chaîne attribuée est ensuite renvoyée.
voir:
publicstaticNSMutableAttributedStringGetFormattedText(string[] texts,UIColor[] colors,UIFont[] fonts){NSMutableAttributedString attrString =newNSMutableAttributedString(string.Join("", texts));int position =0;for(int i =0; i < texts.Length; i++){
attrString.AddAttribute(newNSString("NSForegroundColorAttributeName"), colors[i],newNSRange(position, texts[i].Length));var fontAttribute =newUIStringAttributes{Font= fonts[i]};
attrString.AddAttributes(fontAttribute,newNSRange(position, texts[i].Length));
position += texts[i].Length;}return attrString;}
Dans mon cas, j'utilise Xcode 10.1. Il existe une option permettant de basculer entre le texte brut et le texte attribué dans le texte d'étiquette dans Interface Builder
J'espère que cela peut aider quelqu'un d'autre ..!
Il semble que XCode 11.0 a cassé l'éditeur de texte attribué. J'ai donc essayé d'utiliser TextEdit pour créer le texte, puis je l'ai collé dans Xcode et cela a étonnamment bien fonctionné.
Cela fonctionnait avec une seule couleur différente dans le même texte, mais vous pouvez l'adapter facilement à plusieurs couleurs dans la même phrase.
Réponses:
La façon de le faire est d'utiliser
NSAttributedString
comme ceci:J'ai créé une
UILabel
extension pour le faire .la source
J'ai fait cela en créant un
category
pourNSMutableAttributedString
Utilisez-le comme
SWIFT 3
USAGE
SWIFT 4 @ kj13 Merci de l'avoir notifié
J'ai fait plus d'expériences avec les attributs et ci-dessous sont les résultats, voici le SOURCECODE
Voici le résultat
la source
Voici
la source
Swift 4
Résultat
Swift 3
Résultat:
la source
la source
Depuis iOS 6 , UIKit prend en charge le dessin de chaînes attribuées, aucune extension ou remplacement n'est donc nécessaire.
De
UILabel
:Il vous suffit de créer votre fichier
NSAttributedString
. Il existe essentiellement deux façons:Ajoutez des morceaux de texte avec les mêmes attributs - pour chaque partie, créez une
NSAttributedString
instance et ajoutez-les à uneNSMutableAttributedString
Créez un texte attribué à partir d'une chaîne simple, puis ajoutez un attribut pour des plages données - trouvez la plage de votre numéro (ou autre) et appliquez un attribut de couleur différent à cela.
la source
Anups répond rapidement. Peut être réutilisé à partir de n'importe quelle classe.
Dans le fichier rapide
Dans certains contrôleur de vue
la source
Avoir un UIWebView ou plus d'un UILabel pourrait être considéré comme excessif pour cette situation.
Ma suggestion serait d'utiliser TTTAttributedLabel, qui remplace UILabel qui prend en charge NSAttributedString . Cela signifie que vous pouvez très facilement appliquer différents styles à différentes plages d'une chaîne.
la source
Pour afficher du texte court et formaté qui n'a pas besoin d'être modifiable, Core Text est la voie à suivre. Il existe plusieurs projets open source pour les étiquettes qui utilisent
NSAttributedString
et Core Text pour le rendu. Voir CoreTextAttributedLabel ou OHAttributedLabel par exemple.la source
NSAttributedString
est la voie à suivre. La question suivante a une excellente réponse qui vous montre comment le faire Comment utilisez-vous NSAttributedStringla source
JTAttributedLabel (par mystcolor) vous permet d'utiliser le support des chaînes attribuées dans UILabel sous iOS 6 et en même temps sa classe JTAttributedLabel sous iOS 5 via son JTAutoLabel.
la source
Il existe une solution Swift 3.0
Et il y a un exemple d'appel:
la source
Swift 4 et supérieur: Inspiré de la solution anoop4real , voici une extension String qui peut être utilisée pour générer du texte avec 2 couleurs différentes.
L'exemple suivant change la couleur de l'astérisque en rouge tout en conservant la couleur de l'étiquette d'origine pour le texte restant.
la source
Ma réponse a également la possibilité de colorer toutes les occurrences d'un texte non seulement une occurrence de celui-ci: "wa ba wa ba dubdub", vous pouvez colorier toutes les occurrences de wa non seulement la première occurrence comme la réponse acceptée.
Vous pouvez maintenant faire ceci:
la source
Pour les utilisateurs de Xamarin , j'ai un C # statique méthode laquelle je passe un tableau de chaînes, un tableau d'UIColours et un tableau d'UIFont (ils devront correspondre en longueur). La chaîne attribuée est ensuite renvoyée.
voir:
la source
Dans mon cas, j'utilise Xcode 10.1. Il existe une option permettant de basculer entre le texte brut et le texte attribué dans le texte d'étiquette dans Interface Builder
J'espère que cela peut aider quelqu'un d'autre ..!
la source
la source
Ma propre solution a été créée une méthode comme la suivante:
Cela fonctionnait avec une seule couleur différente dans le même texte, mais vous pouvez l'adapter facilement à plusieurs couleurs dans la même phrase.
la source
En utilisant le code ci-dessous, vous pouvez définir plusieurs couleurs en fonction du mot.
la source
SwiftRichString
fonctionne parfaitement! Vous pouvez utiliser+
pour concaténer deux chaînes attribuéesla source