Я только что добавил ваше расширение в свой проект! Спасибо!
Зеб
Хорошая категория для UILabel. Большое спасибо. Это должен быть принятый ответ.
Прадип Редди Кипа
63
Я сделал это, создав categoryдляNSMutableAttributedString
-(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];}}
Используйте это как
-(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 Спасибо за уведомление.
// 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!)}}
Я провел больше экспериментов с атрибутами, и ниже представлены результаты, вот ИСТОЧНИК
Вам нужно создать новую категорию для NSMutableAttributedString с помощью метода ... в любом случае я добавил этот образец в github, вы можете взять и проверить его github.com/anoop4real/NSMutableAttributedString-Color
anoop4real
Но мне нужно установить цвет всего алфавита с помощью нечувствительности в строке .... как все «е» в красном цвете всей строки
Рави Оджха
Нет видимого @interface для 'NSMutableAttributedString' объявляет селектор 'setColorForText: withColor:'
ekashking 01
1
Я получил ошибку «Использование неразрешенного идентификатора NSForegroundColorAttributeName» в Swift4.1, но я заменяю NSForegroundColorAttributeName на «NSAttributedStringKey.foregroundColor» и строю правильно.
kj13
1
@ kj13 Спасибо за уведомление, я обновил ответ и добавил еще несколько стилей
//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;
Вам просто нужно нарастить свой NSAttributedString. В основном есть два способа:
Добавляйте фрагменты текста с одинаковыми атрибутами - для каждой части создайте один NSAttributedStringэкземпляр и добавьте их в одинNSMutableAttributedString
Создайте текст с атрибутами из простой строки, а затем добавьте атрибуты для заданных диапазонов - найдите диапазон своего номера (или чего-то еще) и примените к нему другой атрибут цвета.
Наличие UIWebView или нескольких UILabel в этой ситуации может считаться излишним.
Я предлагаю использовать TTTAttributedLabel, который является заменой для UILabel, который поддерживает NSAttributedString . Это означает, что вы можете очень легко применять разные стили к разным диапазонам в строке.
Для отображения короткого отформатированного текста, который не нужно редактировать, лучше всего подойдет Core Text . Существует несколько проектов с открытым исходным кодом для этикеток, которые используют NSAttributedStringи Core Text для рендеринга. См., Например, CoreTextAttributedLabel или OHAttributedLabel .
JTAttributedLabel (by mystcolor) позволяет использовать поддержку строк с атрибутами в UILabel под iOS 6 и в то же время его класс JTAttributedLabel под iOS 5 через его JTAutoLabel.
Привет, как мне это сделать, если я хочу добавить два разных colorString? Я попытался использовать ваш пример и просто добавить еще один, но он все еще окрашивает только один из них ..
Проблема в том, что если две строки одинаковы, он окрашивает только одну из них, посмотрите здесь: pastebin.com/FJZJTpp3 . У вас есть исправление для этого?
Эрик Ауранауне
2
Swift 4 и выше: Вдохновленный решением anoop4real , вот расширение String, которое можно использовать для создания текста с двумя разными цветами.
В моем ответе также есть возможность раскрасить все вхождения текста, а не только одно его вхождение: «wa ba wa ba dubdub», вы можете раскрасить все вхождения wa, а не только первое вхождение, как принятый ответ.
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))}}}}
Теперь вы можете это сделать:
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
Для пользователей Xamarin у меня есть статический метод C #, в котором я передаю массив строк, массив UIColours и массив UIFonts (они должны совпадать по длине). Приписанная строка затем передается обратно.
видеть:
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;}
В моем случае я использую Xcode 10.1. Существует возможность переключения между обычным текстом и текстом с атрибутами в тексте метки в Interface Builder.
Похоже, что XCode 11.0 сломал редактор текста с атрибутами. Итак, я попытался использовать TextEdit для создания текста, а затем вставил его в Xcode, и это сработало на удивление хорошо.
Ответы:
Это можно сделать
NSAttributedString
следующим образом:Я создал
UILabel
расширение для этого .источник
Я сделал это, создав
category
дляNSMutableAttributedString
Используйте это как
SWIFT 3
ИСПОЛЬЗОВАНИЕ
SWIFT 4 @ kj13 Спасибо за уведомление.
Я провел больше экспериментов с атрибутами, и ниже представлены результаты, вот ИСТОЧНИК
Вот результат
источник
Ну вот
источник
Swift 4
Результат
Swift 3
Результат:
источник
источник
Начиная с iOS 6 , UIKit поддерживает рисование строк с атрибутами, поэтому расширение или замена не требуется.
Откуда
UILabel
:Вам просто нужно нарастить свой
NSAttributedString
. В основном есть два способа:Добавляйте фрагменты текста с одинаковыми атрибутами - для каждой части создайте один
NSAttributedString
экземпляр и добавьте их в одинNSMutableAttributedString
Создайте текст с атрибутами из простой строки, а затем добавьте атрибуты для заданных диапазонов - найдите диапазон своего номера (или чего-то еще) и примените к нему другой атрибут цвета.
источник
Анупс отвечает быстро. Можно повторно использовать из любого класса.
В быстром файле
В некотором контроллере представления
источник
Наличие UIWebView или нескольких UILabel в этой ситуации может считаться излишним.
Я предлагаю использовать TTTAttributedLabel, который является заменой для UILabel, который поддерживает NSAttributedString . Это означает, что вы можете очень легко применять разные стили к разным диапазонам в строке.
источник
Для отображения короткого отформатированного текста, который не нужно редактировать, лучше всего подойдет Core Text . Существует несколько проектов с открытым исходным кодом для этикеток, которые используют
NSAttributedString
и Core Text для рендеринга. См., Например, CoreTextAttributedLabel или OHAttributedLabel .источник
NSAttributedString
это путь. Следующий вопрос имеет отличный ответ, который показывает вам, как это сделать. Как вы используете NSAttributedStringисточник
JTAttributedLabel (by mystcolor) позволяет использовать поддержку строк с атрибутами в UILabel под iOS 6 и в то же время его класс JTAttributedLabel под iOS 5 через его JTAutoLabel.
источник
Есть решение Swift 3.0
И вот пример звонка:
источник
Swift 4 и выше: Вдохновленный решением anoop4real , вот расширение String, которое можно использовать для создания текста с двумя разными цветами.
В следующем примере цвет звездочки изменяется на красный, но для оставшегося текста сохраняется исходный цвет метки.
источник
В моем ответе также есть возможность раскрасить все вхождения текста, а не только одно его вхождение: «wa ba wa ba dubdub», вы можете раскрасить все вхождения wa, а не только первое вхождение, как принятый ответ.
Теперь вы можете это сделать:
источник
Для пользователей Xamarin у меня есть статический метод C #, в котором я передаю массив строк, массив UIColours и массив UIFonts (они должны совпадать по длине). Приписанная строка затем передается обратно.
видеть:
источник
В моем случае я использую Xcode 10.1. Существует возможность переключения между обычным текстом и текстом с атрибутами в тексте метки в Interface Builder.
Надеюсь, это поможет кому-то другому ..!
источник
источник
Мое собственное решение было создано методом, подобным следующему:
Он работал только с одним другим цветом в одном и том же тексте, но вы можете легко адаптировать его к большему количеству цветов в одном предложении.
источник
Используя приведенный ниже код, вы можете установить несколько цветов на основе слова.
источник
SwiftRichString
работает отлично! Вы можете использовать+
для объединения двух строк с атрибутамиисточник