Изменение определенного цвета текста с помощью NSMutableAttributedString в Swift
У меня проблема в том, что я хочу иметь возможность изменить textColor определенного текста в TextView. Я использую объединенную строку и просто хочу строки, которые добавляю в текст TextView. Похоже, что я хочу использовать NSMutableAttributedString
, но я не нахожу никаких ресурсов, как использовать это в Swift. То, что я до сих пор, выглядит примерно так:
let string = "A \(stringOne) with \(stringTwo)"
var attributedString = NSMutableAttributedString(string: string)
textView.attributedText = attributedString
Отсюда я знаю, что мне нужно найти диапазон слов, для которых нужно изменить их textColor, а затем добавить их в соответствующую строку. То, что мне нужно знать, это как найти правильные строки из attributeString, а затем изменить их textColor.
Так как у меня слишком низкий рейтинг, я не могу ответить на свой вопрос, но вот ответ, который я нашел
Я нашел свой ответ, переводя с перевода некоторого кода с
Изменить атрибуты подстрок в NSAttributedString
Вот пример реализации в Swift:
let string = "A \(stringOne) and \(stringTwo)"
var attributedString = NSMutableAttributedString(string:string)
let stringOneRegex = NSRegularExpression(pattern: nameString, options: nil, error: nil)
let stringOneMatches = stringOneRegex.matchesInString(longString, options: nil, range: NSMakeRange(0, attributedString.length))
for stringOneMatch in stringOneMatches {
let wordRange = stringOneMatch.rangeAtIndex(0)
attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.nameColor(), range: wordRange)
}
textView.attributedText = attributedString
Так как я хочу изменить textColor нескольких строк, я сделаю вспомогательную функцию, чтобы справиться с этим, но это работает для изменения textColor.
Ответы
Ответ 1
Я вижу, что вы несколько ответили на вопрос, но чтобы дать немного более краткий способ без использования регулярных выражений для ответа на заглавный вопрос:
Чтобы изменить цвет длины текста, вам нужно знать начальный и конечный индекс цветных символов в строке, например:
var main_string = "Hello World"
var string_to_color = "World"
var range = (main_string as NSString).rangeOfString(string_to_color)
Затем вы конвертируете в атрибутивную строку и используете "добавить атрибут" с NSForegroundColorAttributeName:
var attributedString = NSMutableAttributedString(string:main_string)
attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor() , range: range)
Список дополнительных стандартных атрибутов, которые вы можете установить, можно найти в документации Apple.
Ответ 2
SWIFT 5
let main_string = "Hello World"
let string_to_color = "World"
let range = (main_string as NSString).range(of: string_to_color)
let attribute = NSMutableAttributedString.init(string: main_string)
attribute.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red , range: range)
txtfield1 = UITextField.init(frame:CGRect(x:10 , y:20 ,width:100 , height:100))
txtfield1.attributedText = attribute
SWIFT 4.2
let txtfield1 :UITextField!
let main_string = "Hello World"
let string_to_color = "World"
let range = (main_string as NSString).range(of: string_to_color)
let attribute = NSMutableAttributedString.init(string: main_string)
attribute.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red , range: range)
txtfield1 = UITextField.init(frame:CGRect(x:10 , y:20 ,width:100 , height:100))
txtfield1.attributedText = attribute
Ответ 3
Обновление Swift 2.1:
let text = "We tried to make this app as most intuitive as possible for you. If you have any questions don't hesitate to ask us. For a detailed manual just click here."
let linkTextWithColor = "click here"
let range = (text as NSString).rangeOfString(linkTextWithColor)
let attributedString = NSMutableAttributedString(string:text)
attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor() , range: range)
self.helpText.attributedText = attributedString
self.helpText
является выходом UILabel
.
Ответ 4
Ответ уже указан в предыдущих сообщениях, но у меня есть другой способ сделать это
Swift 3x:
var myMutableString = NSMutableAttributedString()
myMutableString = NSMutableAttributedString(string: "Your full label textString")
myMutableString.setAttributes([NSFontAttributeName : UIFont(name: "HelveticaNeue-Light", size: CGFloat(17.0))!
, NSForegroundColorAttributeName : UIColor(red: 232 / 255.0, green: 117 / 255.0, blue: 40 / 255.0, alpha: 1.0)], range: NSRange(location:12,length:8)) // What ever range you want to give
yourLabel.attributedText = myMutableString
Надеюсь, это поможет любому!
Ответ 5
Ответ Криса был большой помощью для меня, поэтому я использовал его подход и превратился в функцию, которую я могу повторно использовать. Это позволяет мне назначать цвет подстроке, давая остальной части строки другой цвет.
static func createAttributedString(fullString: String, fullStringColor: UIColor, subString: String, subStringColor: UIColor) -> NSMutableAttributedString
{
let range = (fullString as NSString).rangeOfString(subString)
let attributedString = NSMutableAttributedString(string:fullString)
attributedString.addAttribute(NSForegroundColorAttributeName, value: fullStringColor, range: NSRange(location: 0, length: fullString.characters.count))
attributedString.addAttribute(NSForegroundColorAttributeName, value: subStringColor, range: range)
return attributedString
}
Ответ 6
Swift 4.1
NSAttributedStringKey.foregroundColor
например, если вы хотите изменить шрифт в NavBar:
self.navigationController?.navigationBar.titleTextAttributes = [ NSAttributedStringKey.font: UIFont.systemFont(ofSize: 22), NSAttributedStringKey.foregroundColor: UIColor.white]
Ответ 7
Вы можете использовать это расширение, я проверяю его
Swift 4.2
import Foundation
import UIKit
extension NSMutableAttributedString {
convenience init (fullString: String, fullStringColor: UIColor, subString: String, subStringColor: UIColor) {
let rangeOfSubString = (fullString as NSString).range(of: subString)
let rangeOfFullString = NSRange(location: 0, length: fullString.count)//fullString.range(of: fullString)
let attributedString = NSMutableAttributedString(string:fullString)
attributedString.addAttribute(NSAttributedStringKey.foregroundColor, value: fullStringColor, range: rangeOfFullString)
attributedString.addAttribute(NSAttributedStringKey.foregroundColor, value: subStringColor, range: rangeOfSubString)
self.init(attributedString: attributedString)
}
}
Ответ 8
Swift 4.2 и Swift 5 раскрашивают части струны.
Очень простой способ использовать NSMutableAttributedString при расширении String. Это также может быть использовано для окрашивания более одного слова во всей строке.
Добавить новый файл для расширений, Файл → Новый → Новый файл с именем для ex. "NSAttributedString + TextColouring" и добавьте код
import UIKit
extension String {
func attributedStringWithColor(_ strings: [String], color: UIColor, characterSpacing: UInt? = nil) -> NSAttributedString {
let attributedString = NSMutableAttributedString(string: self)
for string in strings {
let range = (self as NSString).range(of: string)
attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: color, range: range)
}
guard let characterSpacing = characterSpacing else {return attributedString}
attributedString.addAttribute(NSAttributedString.Key.kern, value: characterSpacing, range: NSRange(location: 0, length: attributedString.length))
return attributedString
}
}
Теперь вы можете использовать глобально на любом контроллере представления:
let attributedWithTextColor: NSAttributedString = "Doc, welcome back :)".attributedStringWithColor(["Doc", "back"], color: UIColor.black)
myLabel.attributedText = attributedWithTextColor
![Example of using text colouring with swift 4]()
Ответ 9
Swift 2.2
var myMutableString = NSMutableAttributedString()
myMutableString = NSMutableAttributedString(string: "1234567890", attributes: [NSFontAttributeName:UIFont(name: kDefaultFontName, size: 14.0)!])
myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor(red: 0.0/255.0, green: 125.0/255.0, blue: 179.0/255.0, alpha: 1.0), range: NSRange(location:0,length:5))
self.lblPhone.attributedText = myMutableString
Ответ 10
Основываясь на ответах, прежде чем я создал расширение строки
extension String {
func highlightWordsIn(highlightedWords: String, attributes: [[NSAttributedStringKey: Any]]) -> NSMutableAttributedString {
let range = (self as NSString).range(of: highlightedWords)
let result = NSMutableAttributedString(string: self)
for attribute in attributes {
result.addAttributes(attribute, range: range)
}
return result
}
}
Вы можете передать атрибуты текста методу
Звоните так
let attributes = [[NSAttributedStringKey.foregroundColor:UIColor.red], [NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 17)]]
myLabel.attributedText = "This is a text".highlightWordsIn(highlightedWords: "is a text", attributes: attributes)
Ответ 11
Swift 4.1
Я изменился с этого в Swift 3
let str = "Welcome "
let welcomeAttribute = [ NSForegroundColorAttributeName: UIColor.blue()]
let welcomeAttrString = NSMutableAttributedString(string: str, attributes: welcomeAttribute)
И это в Swift 4.0
let str = "Welcome "
let welcomeAttribute = [ NSAttributedStringKey.foregroundColor: UIColor.blue()]
let welcomeAttrString = NSMutableAttributedString(string: str, attributes: welcomeAttribute)
на Swift 4.1
let str = "Welcome "
let welcomeAttribute = [ NSAttributedStringKey(rawValue: NSForegroundColorAttributeName): UIColor.blue()]
let welcomeAttrString = NSMutableAttributedString(string: str, attributes: welcomeAttribute)
Работает отлично
Ответ 12
Самый простой способ сделать ярлык с другим стилем, таким как цвет, шрифт и т.д., - это свойство "Attributed" в Attributes Inspector. Просто выберите часть текста и измените его, как хотите.
![введите описание изображения здесь]()
Ответ 13
Для всех, кто ищет " Применение определенного цвета к нескольким словам в тексте ", мы можем сделать это с помощью NSRegularExpression
func highlight(matchingText: String, in text: String) {
let attributedString = NSMutableAttributedString(string: text)
if let regularExpression = try? NSRegularExpression(pattern: "\(matchingText)", options: .caseInsensitive) {
let matchedResults = regularExpression.matches(in: text, options: [], range: NSRange(location: 0, length: attributedString.length))
for matched in matchedResults {
attributedString.addAttributes([NSAttributedStringKey.backgroundColor : UIColor.yellow], range: matched.range)
}
yourLabel.attributedText = attributedString
}
}
Ссылочная ссылка: https://gist.github.com/aquajach/4d9398b95a748fd37e88
Ответ 14
Swift 4.2
let textString = "Hello world"
let range = (textString as NSString).range(of: "world")
let attributedString = NSMutableAttributedString(string: textString)
attributedString.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red, range: range)
self.textUIlable.attributedText = attributedString
Ответ 15
Это может быть работой для вас
let main_string = " User not found,Want to review ? Click here"
let string_to_color = "Click here"
let range = (main_string as NSString).range(of: string_to_color)
let attribute = NSMutableAttributedString.init(string: main_string)
attribute.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.blue , range: range)
lblClickHere.attributedText = attribute
Ответ 16
Если вы используете Swift 3x и UITextView, возможно, NSForegroundColorAttributeName не будет работать (это не сработало для меня независимо от того, какой подход я попытался).
Итак, после некоторого поиска я нашел решение.
//Get the textView somehow
let textView = UITextView()
//Set the attributed string with links to it
textView.attributedString = attributedString
//Set the tint color. It will apply to the link only
textView.tintColor = UIColor.red
Ответ 17
Чтобы изменить цвет шрифта, сначала выберите атрибуты вместо обычного, как показано на рисунке ниже.
Затем вам нужно выделить текст в атрибутивном поле, а затем выбрать цветную кнопку с правой стороны выравниваний. Это изменит цвет.
![]()
Ответ 18
Супер простой способ сделать это.
let text = "This is a colorful attributed string"
let attributedText =
NSMutableAttributedString.getAttributedString(fromString: text)
attributedText.apply(color: .red, subString: "This")
//Apply yellow color on range
attributedText.apply(color: .yellow, onRange: NSMakeRange(5, 4))
Для более подробной информации нажмите здесь: https://github.com/iOSTechHub/AttributedString
Ответ 19
Вы можете использовать этот метод. Я реализовал этот метод в своем обычном служебном классе для глобального доступа.
func attributedString(with highlightString: String, normalString: String, highlightColor: UIColor) -> NSMutableAttributedString {
let attributes = [NSAttributedString.Key.foregroundColor: highlightColor]
let attributedString = NSMutableAttributedString(string: highlightString, attributes: attributes)
attributedString.append(NSAttributedString(string: normalString))
return attributedString
}
Ответ 20
Вам нужно изменить параметры просмотра текста, а не параметры приписанной строки
textView.linkTextAttributes = [
NSAttributedString.Key.foregroundColor: UIColor.red,
NSAttributedString.Key.underlineColor: UIColor.red,
NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue
]
Ответ 21
Пожалуйста, проверьте Cocoapod Prestyler:
Prestyler.defineRule("$", UIColor.orange)
label.attributedText = "This $text$ is orange".prestyled()