Właśnie dodałem Twoje rozszerzenie do mojego projektu! Dzięki!
Zeb
Dobra kategoria dla UILabel. Wielkie dzięki. To powinna być akceptowana odpowiedź.
Pradeep Reddy Kypa
63
Zrobiłem to, tworząc categoryforNSMutableAttributedString
-(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];}}
Użyj tego jak
-(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 Dziękujemy za powiadomienie
// 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!)}}
Przeprowadziłem więcej eksperymentów z atrybutami, a poniżej są wyniki, oto KOD ŹRÓDŁOWY
//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;
Musisz tylko rozbudować swoją NSAttributedString. Zasadniczo istnieją dwa sposoby:
Dołącz fragmenty tekstu o tych samych atrybutach - dla każdej części utwórz jedno NSAttributedStringwystąpienie i dołącz je do jednegoNSMutableAttributedString
Utwórz przypisany tekst ze zwykłego ciągu, a następnie dodaj przypisany dla podanych zakresów - znajdź zakres swojego numeru (lub cokolwiek) i zastosuj do niego inny atrybut koloru.
Posiadanie UIWebView lub więcej niż jednego UILabel można uznać za przesadę w tej sytuacji.
Moją sugestią byłoby użycie TTTAttributedLabel, który jest zastępczym zamiennikiem dla UILabel, który obsługuje NSAttributedString . Oznacza to, że możesz bardzo łatwo zastosować różne style do różnych zakresów w ciągu.
Aby wyświetlić krótki, sformatowany tekst, który nie musi być edytowalny, najlepszym rozwiązaniem jest tekst podstawowy . Istnieje kilka projektów typu open source dla etykiet, które używają NSAttributedStringtekstu podstawowego do renderowania. Zobacz na przykład CoreTextAttributedLabel lub OHAttributedLabel .
JTAttributedLabel (od mystcolor) umożliwia użycie przypisanej obsługi ciągów w UILabel w systemie iOS 6 i jednocześnie jego klasy JTAttributedLabel w iOS 5 za pośrednictwem JTAutoLabel.
Problem polega na tym, że jeśli dwa ciągi są takie same, koloruje tylko jeden z nich, spójrz tutaj: pastebin.com/FJZJTpp3 . Masz też na to rozwiązanie?
Erik Auranaune
2
Swift 4 i nowszy: Zainspirowany rozwiązaniem anoop4real , oto rozszerzenie String, którego można użyć do wygenerowania tekstu w 2 różnych kolorach.
Moja odpowiedź ma również możliwość pokolorowania całego wystąpienia tekstu, a nie tylko jednego jego wystąpienia: „wa ba wa ba dubdub”, można pokolorować całe wystąpienie wa nie tylko pierwszego wystąpienia, jak przyjęta odpowiedź.
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))}}}}
Teraz możesz to zrobić:
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
Dla użytkowników platformy Xamarin mam statyczny C # metodę , w której przekazuję tablicę ciągów, tablicę kolorów UIColours i tablicę UIFonts (będą musiały pasować pod względem długości). Przypisany ciąg jest następnie przekazywany z powrotem.
widzieć:
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;}
W moim przypadku używam Xcode 10.1. Istnieje możliwość przełączania między zwykłym tekstem a tekstem z atrybutami w tekście etykiety w programie Interface Builder
Wygląda na to, że XCode 11.0 zepsuł edytor Attributed Text. Próbowałem więc użyć TextEdit, aby utworzyć tekst, a następnie wkleiłem go do Xcode i zadziałało zaskakująco dobrze.
Odpowiedzi:
Aby to zrobić, użyj
NSAttributedString
:Stworzyłem
UILabel
rozszerzenie, aby to zrobić .źródło
Zrobiłem to, tworząc
category
forNSMutableAttributedString
Użyj tego jak
SWIFT 3
STOSOWANIE
SWIFT 4 @ kj13 Dziękujemy za powiadomienie
Przeprowadziłem więcej eksperymentów z atrybutami, a poniżej są wyniki, oto KOD ŹRÓDŁOWY
Oto wynik
źródło
Proszę bardzo
źródło
Szybki 4
Wynik
Szybki 3
Wynik:
źródło
źródło
Od iOS 6 UIKit obsługuje rysowanie przypisanych ciągów, więc nie jest potrzebne żadne rozszerzenie ani wymiana.
Od
UILabel
:Musisz tylko rozbudować swoją
NSAttributedString
. Zasadniczo istnieją dwa sposoby:Dołącz fragmenty tekstu o tych samych atrybutach - dla każdej części utwórz jedno
NSAttributedString
wystąpienie i dołącz je do jednegoNSMutableAttributedString
Utwórz przypisany tekst ze zwykłego ciągu, a następnie dodaj przypisany dla podanych zakresów - znajdź zakres swojego numeru (lub cokolwiek) i zastosuj do niego inny atrybut koloru.
źródło
Anups odpowiada szybko. Może być ponownie użyty z dowolnej klasy.
W szybkim pliku
W niektórych widok kontrolera
źródło
Posiadanie UIWebView lub więcej niż jednego UILabel można uznać za przesadę w tej sytuacji.
Moją sugestią byłoby użycie TTTAttributedLabel, który jest zastępczym zamiennikiem dla UILabel, który obsługuje NSAttributedString . Oznacza to, że możesz bardzo łatwo zastosować różne style do różnych zakresów w ciągu.
źródło
Aby wyświetlić krótki, sformatowany tekst, który nie musi być edytowalny, najlepszym rozwiązaniem jest tekst podstawowy . Istnieje kilka projektów typu open source dla etykiet, które używają
NSAttributedString
tekstu podstawowego do renderowania. Zobacz na przykład CoreTextAttributedLabel lub OHAttributedLabel .źródło
NSAttributedString
jest droga do zrobienia. Poniższe pytanie ma świetną odpowiedź, która pokazuje, jak to zrobić. Jak używać NSAttributedStringźródło
JTAttributedLabel (od mystcolor) umożliwia użycie przypisanej obsługi ciągów w UILabel w systemie iOS 6 i jednocześnie jego klasy JTAttributedLabel w iOS 5 za pośrednictwem JTAutoLabel.
źródło
Istnieje rozwiązanie Swift 3.0
Oto przykład połączenia:
źródło
Swift 4 i nowszy: Zainspirowany rozwiązaniem anoop4real , oto rozszerzenie String, którego można użyć do wygenerowania tekstu w 2 różnych kolorach.
Poniższy przykład zmienia kolor gwiazdki na czerwony, zachowując oryginalny kolor etykiety dla pozostałego tekstu.
źródło
Moja odpowiedź ma również możliwość pokolorowania całego wystąpienia tekstu, a nie tylko jednego jego wystąpienia: „wa ba wa ba dubdub”, można pokolorować całe wystąpienie wa nie tylko pierwszego wystąpienia, jak przyjęta odpowiedź.
Teraz możesz to zrobić:
źródło
Dla użytkowników platformy Xamarin mam statyczny C # metodę , w której przekazuję tablicę ciągów, tablicę kolorów UIColours i tablicę UIFonts (będą musiały pasować pod względem długości). Przypisany ciąg jest następnie przekazywany z powrotem.
widzieć:
źródło
W moim przypadku używam Xcode 10.1. Istnieje możliwość przełączania między zwykłym tekstem a tekstem z atrybutami w tekście etykiety w programie Interface Builder
Mam nadzieję, że to może pomóc komuś innemu ..!
źródło
źródło
Moje własne rozwiązanie zostało stworzone metodą taką jak następna:
Działał tylko z jednym innym kolorem w tym samym tekście, ale można go łatwo dostosować do większej liczby kolorów w tym samym zdaniu.
źródło
Korzystając z poniższego kodu, możesz ustawić wiele kolorów na podstawie słowa.
źródło
SwiftRichString
działa idealnie! Możesz użyć+
do połączenia dwóch przypisanych ciągówźródło