Acabei de adicionar sua extensão ao meu projeto! THX!
Zeb
Boa categoria para UILabel. Muito obrigado. Esta deve ser a resposta aceita.
Pradeep Reddy Kypa,
63
Eu fiz isso criando um categoryparaNSMutableAttributedString
-(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];}}
Use como
-(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 Obrigado por notificar
// 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á fiz mais experimentos com atributos e abaixo estão os resultados, aqui está o SOURCECODE
Você precisa criar uma nova categoria para NSMutableAttributedString com o método ... de qualquer forma, adicionei este exemplo ao github, você pode pegar e verificar github.com/anoop4real/NSMutableAttributedString-Color
anoop4real
Mas eu preciso definir a cor de todo o alfabeto com incasensitive em uma string ... como todo "e" na cor vermelha de toda a string
Ravi Ojha
Sem @interface visível para 'NSMutableAttributedString' declara o seletor 'setColorForText: withColor:'
ekashking 01 de
1
Recebi o erro 'Uso de identificador não resolvido' NSForegroundColorAttributeName 'por Swift4.1, mas substituo' NSForegroundColorAttributeName 'por' NSAttributedStringKey.foregroundColor 'e estou construindo corretamente.
kj13
1
@ kj13 Obrigado por notificar, atualizei a resposta e adicionei mais alguns estilos
//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;
Você só precisa construir o seu NSAttributedString. Existem basicamente duas maneiras:
Anexe pedaços de texto com os mesmos atributos - para cada parte, crie uma NSAttributedStringinstância e anexe-as a umaNSMutableAttributedString
Crie um texto atribuído a partir de uma string simples e, em seguida, adicione os atribuídos para determinados intervalos - encontre o intervalo do seu número (ou qualquer outro) e aplique um atributo de cor diferente nele.
Ter um UIWebView ou mais de um UILabel pode ser considerado um exagero para essa situação.
Minha sugestão seria usar TTTAttributedLabel, que é um substituto direto para UILabel que oferece suporte a NSAttributedString . Isso significa que você pode facilmente aplicar estilos diferentes a intervalos diferentes em uma string.
Para exibir texto curto e formatado que não precisa ser editável, Core Text é o caminho a seguir. Existem vários projetos de código aberto para rótulos que usam NSAttributedStringe Core Text para renderização. Consulte CoreTextAttributedLabel ou OHAttributedLabel por exemplo.
JTAttributedLabel (por mystcolor ) permite que você use o suporte de string atribuído em UILabel no iOS 6 e ao mesmo tempo sua classe JTAttributedLabel no iOS 5 por meio de seu JTAutoLabel.
Olá, como faço isso se quiser adicionar duas colorStrings diferentes? Tentei usar o seu exemplo e apenas adicionar outro, mas ainda assim só dá cor a um deles.
Erik Auranaune
Tente isto: let colorString = "(string em vermelho)" let colorStringGreen = "(string em verde)" self.mLabel.text = "cor clássica" + colorString + colorStringGreen self.mLabel.setSubTextColor (pSubString: colorString, pColor: UIColor .red) self.mLabel.setSubTextColor (pSubString: colorStringGreen, pColor: UIColor.green)
Um problema é que, se as duas strings forem iguais, apenas uma delas será colorida, veja aqui: pastebin.com/FJZJTpp3 . Você tem uma solução para isso também?
Erik Auranaune
2
Swift 4 e superior: Inspirado na solução anoop4real , aqui está uma extensão String que pode ser usada para gerar texto com 2 cores diferentes.
Minha resposta também tem a opção de colorir toda a ocorrência de um texto, não apenas uma ocorrência dele: "wa ba wa ba dubdub", você pode colorir toda a ocorrência de wa não apenas a primeira ocorrência como a resposta aceita.
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))}}}}
Agora você pode fazer isso:
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
Para usuários do Xamarin , tenho um método C # estático em que passo uma matriz de strings, uma matriz de UIColours e uma matriz de UIFonts (eles precisarão ter comprimento igual). A string atribuída é então passada de volta.
Vejo:
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;}
Parece que o XCode 11.0 quebrou o editor de texto atribuído. Então, tentei usar o TextEdit para criar o texto e colei-o no Xcode e funcionou surpreendentemente bem.
Respostas:
A maneira de fazer isso é usar
NSAttributedString
assim:Criei uma
UILabel
extensão para fazer isso .fonte
Eu fiz isso criando um
category
paraNSMutableAttributedString
Use como
SWIFT 3
USO
SWIFT 4 @ kj13 Obrigado por notificar
Já fiz mais experimentos com atributos e abaixo estão os resultados, aqui está o SOURCECODE
Aqui está o resultado
fonte
Aqui está
fonte
Swift 4
Resultado
Swift 3
Resultado:
fonte
fonte
Desde o iOS 6 , o UIKit suporta o desenho de strings atribuídas, portanto, nenhuma extensão ou substituição é necessária.
De
UILabel
:Você só precisa construir o seu
NSAttributedString
. Existem basicamente duas maneiras:Anexe pedaços de texto com os mesmos atributos - para cada parte, crie uma
NSAttributedString
instância e anexe-as a umaNSMutableAttributedString
Crie um texto atribuído a partir de uma string simples e, em seguida, adicione os atribuídos para determinados intervalos - encontre o intervalo do seu número (ou qualquer outro) e aplique um atributo de cor diferente nele.
fonte
Anups respondem rapidamente. Pode ser reutilizado em qualquer classe.
Em arquivo rápido
Em algum controlador de visualização
fonte
Ter um UIWebView ou mais de um UILabel pode ser considerado um exagero para essa situação.
Minha sugestão seria usar TTTAttributedLabel, que é um substituto direto para UILabel que oferece suporte a NSAttributedString . Isso significa que você pode facilmente aplicar estilos diferentes a intervalos diferentes em uma string.
fonte
Para exibir texto curto e formatado que não precisa ser editável, Core Text é o caminho a seguir. Existem vários projetos de código aberto para rótulos que usam
NSAttributedString
e Core Text para renderização. Consulte CoreTextAttributedLabel ou OHAttributedLabel por exemplo.fonte
NSAttributedString
é o caminho a percorrer. A pergunta a seguir tem uma ótima resposta que mostra como fazer isso. Como você usa NSAttributedStringfonte
JTAttributedLabel (por mystcolor ) permite que você use o suporte de string atribuído em UILabel no iOS 6 e ao mesmo tempo sua classe JTAttributedLabel no iOS 5 por meio de seu JTAutoLabel.
fonte
Existe uma solução Swift 3.0
E há um exemplo de chamada:
fonte
Swift 4 e superior: Inspirado na solução anoop4real , aqui está uma extensão String que pode ser usada para gerar texto com 2 cores diferentes.
O exemplo a seguir altera a cor do asterisco para vermelho, mantendo a cor do rótulo original para o texto restante.
fonte
Minha resposta também tem a opção de colorir toda a ocorrência de um texto, não apenas uma ocorrência dele: "wa ba wa ba dubdub", você pode colorir toda a ocorrência de wa não apenas a primeira ocorrência como a resposta aceita.
Agora você pode fazer isso:
fonte
Para usuários do Xamarin , tenho um método C # estático em que passo uma matriz de strings, uma matriz de UIColours e uma matriz de UIFonts (eles precisarão ter comprimento igual). A string atribuída é então passada de volta.
Vejo:
fonte
No meu caso, estou usando o Xcode 10.1. Existe uma opção de alternar entre texto simples e texto atribuído no texto do rótulo no Interface Builder
Espero que isso possa ajudar alguém ..!
fonte
fonte
Minha própria solução foi criada um método como o seguinte:
Funcionou com apenas uma cor diferente no mesmo texto, mas você pode adaptá-lo facilmente a mais cores na mesma frase.
fonte
Usando o código abaixo, você pode definir várias cores com base na palavra.
fonte
SwiftRichString
funciona perfeito! Você pode usar+
para concatenar duas strings atribuídasfonte