Как сделать атрибутивную строку с помощью Swift?

Я пытаюсь сделать простой калькулятор кофе. Мне нужно отобразить количество кофе в граммах. Символ "g" для граммов должен быть прикреплен к моей UILabel, которую я использую для отображения суммы. Числа в UILabel динамически изменяются с пользовательским вводом, но мне нужно добавить строчную букву "g" в конце строки, которая отформатирована иначе, чем числа обновления. "G" необходимо прикрепить к номерам, чтобы при изменении размера и положения номера "g" перемещался вместе с числами. Я уверен, что эта проблема была решена раньше, так что ссылка в правильном направлении была бы полезна, поскольку я погуглил свое маленькое сердце.

Я искал в документации атрибутивную строку и даже загрузил "Attributed String Creator" из магазина приложений, но полученный код находится в Objective-C, и я использую Swift. То, что было бы замечательно и, вероятно, полезно для других разработчиков, изучающих этот язык, является ярким примером создания собственного шрифта с настраиваемыми атрибутами с использованием приписанной строки в Swift. Документация для этого очень запутанная, так как нет четкого пути, как это сделать. Мой план состоит в том, чтобы создать приписанную строку и добавить ее в конец моей строки coffeeAmount.

var coffeeAmount: String = calculatedCoffee + attributedText

Где вычисленный кофе - это Int, преобразованный в строку, а "attribuText" - это строчная буква "g" с настроенным шрифтом, который я пытаюсь создать. Может быть, я иду по этому пути неправильно. Любая помощь приветствуется!

31 ответ

Этот ответ был обновлен для Swift 4.0.

Краткий справочник

Общая форма создания и установки приписанной строки выглядит следующим образом. Вы можете найти другие общие варианты ниже.

// create attributed string
let myString = "Swift Attributed String"
let myAttribute = [ NSAttributedStringKey.foregroundColor: UIColor.blue ]
let myAttrString = NSAttributedString(string: myString, attributes: myAttribute) 

// set attributed text on a UILabel
myLabel.attributedText = myAttrString

Цвет текста

let myAttribute = [ NSAttributedStringKey.foregroundColor: UIColor.blue ]

Фоновый цвет

let myAttribute = [ NSAttributedStringKey.backgroundColor: UIColor.yellow ]

Шрифт

let myAttribute = [ NSAttributedStringKey.font: UIFont(name: "Chalkduster", size: 18.0)! ]

let myAttribute = [ NSAttributedStringKey.underlineStyle: NSUnderlineStyle.styleSingle.rawValue ]

let myShadow = NSShadow()
myShadow.shadowBlurRadius = 3
myShadow.shadowOffset = CGSize(width: 3, height: 3)
myShadow.shadowColor = UIColor.gray

let myAttribute = [ NSAttributedStringKey.shadow: myShadow ]

Остальная часть этого поста дает более подробную информацию для тех, кто заинтересован.


Атрибуты

Строковые атрибуты - это просто словарь в форме [NSAttributedStringKey: Any], где NSAttributedStringKey является ключевым именем атрибута и Any значение некоторого Типа. Значением может быть шрифт, цвет, целое число или что-то еще. В Swift есть много стандартных атрибутов, которые уже были предопределены. Например:

  • имя ключа: NSAttributedStringKey.font, значение: UIFont
  • имя ключа: NSAttributedStringKey.foregroundColor, значение: UIColor
  • имя ключа: NSAttributedStringKey.link, значение: NSURL или же String

Есть много других. Смотрите эту ссылку для получения дополнительной информации. Вы даже можете создавать свои собственные атрибуты, такие как:

  • имя ключа: NSAttributedStringKey.myName, значение: какой-то тип.
    если вы делаете расширение:

    extension NSAttributedStringKey {
        static let myName = NSAttributedStringKey(rawValue: "myCustomAttributeKey")
    }
    

Создание атрибутов в Swift

Вы можете объявить атрибуты так же, как и любой другой словарь.

// single attributes declared one at a time
let singleAttribute1 = [ NSAttributedStringKey.foregroundColor: UIColor.green ]
let singleAttribute2 = [ NSAttributedStringKey.backgroundColor: UIColor.yellow ]
let singleAttribute3 = [ NSAttributedStringKey.underlineStyle: NSUnderlineStyle.styleDouble.rawValue ]

// multiple attributes declared at once
let multipleAttributes: [NSAttributedStringKey : Any] = [
    NSAttributedStringKey.foregroundColor: UIColor.green,
    NSAttributedStringKey.backgroundColor: UIColor.yellow,
    NSAttributedStringKey.underlineStyle: NSUnderlineStyle.styleDouble.rawValue ]

// custom attribute
let customAttribute = [ NSAttributedStringKey.myName: "Some value" ]

Обратите внимание rawValue это было необходимо для подчеркивания стиля.

Поскольку атрибуты являются просто словарями, их также можно создать, создав пустой словарь и добавив в него пары ключ-значение. Если значение будет содержать несколько типов, то вы должны использовать Anyкак тип. ЗдесьmultipleAttributesПример сверху, воссоздан таким образом:

var multipleAttributes = [NSAttributedStringKey : Any]()
multipleAttributes[NSAttributedStringKey.foregroundColor] = UIColor.green
multipleAttributes[NSAttributedStringKey.backgroundColor] = UIColor.yellow
multipleAttributes[NSAttributedStringKey.underlineStyle] = NSUnderlineStyle.styleDouble.rawValue

Приписанные Строки

Теперь, когда вы понимаете атрибуты, вы можете создавать атрибутные строки.

инициализация

Есть несколько способов создания приписанных строк. Если вам нужна строка только для чтения, вы можете использоватьNSAttributedString, Вот несколько способов его инициализации:

// Initialize with a string only
let attrString1 = NSAttributedString(string: "Hello.")

// Initialize with a string and inline attribute(s)
let attrString2 = NSAttributedString(string: "Hello.", attributes: [NSAttributedStringKey.myName: "A value"])

// Initialize with a string and separately declared attribute(s)
let myAttributes1 = [ NSAttributedStringKey.foregroundColor: UIColor.green ]
let attrString3 = NSAttributedString(string: "Hello.", attributes: myAttributes1)

Если вам потребуется изменить атрибуты или содержимое строки позже, вы должны использоватьNSMutableAttributedString, Декларации очень похожи:

// Create a blank attributed string
let mutableAttrString1 = NSMutableAttributedString()

// Initialize with a string only
let mutableAttrString2 = NSMutableAttributedString(string: "Hello.")

// Initialize with a string and inline attribute(s)
let mutableAttrString3 = NSMutableAttributedString(string: "Hello.", attributes: [NSAttributedStringKey.myName: "A value"])

// Initialize with a string and separately declared attribute(s)
let myAttributes2 = [ NSAttributedStringKey.foregroundColor: UIColor.green ]
let mutableAttrString4 = NSMutableAttributedString(string: "Hello.", attributes: myAttributes2)

Изменение атрибутной строки

В качестве примера, давайте создадим приписанную строку в верхней части этого поста.

Сначала создайтеNSMutableAttributedStringс новым атрибутом шрифта.

let myAttribute = [ NSAttributedStringKey.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myString = NSMutableAttributedString(string: "Swift", attributes: myAttribute )

Если вы работаете вместе, установите для приписанной строкиUITextView(или жеUILabel) как это:

textView.attributedText = myString

Выне используете textView.text,

Вот результат:

Затем добавьте еще одну атрибутивную строку, для которой не установлены никакие атрибуты. (Обратите внимание, что хотя я использовалletобъявитьmyStringвыше, я все еще могу изменить его, потому что это NSMutableAttributedString, Мне это кажется довольно неспокойным, и я не удивлюсь, если это изменится в будущем. Оставьте мне комментарий, когда это произойдет.)

let attrString = NSAttributedString(string: " Attributed Strings")
myString.append(attrString)

Далее мы просто выберем слово "Strings", которое начинается с индекса17и имеет длину7, Обратите внимание, что это NSRange и не Свифт Range, (См. Этот ответ для получения дополнительной информации о диапазонах.) addAttributeМетод позволяет поместить имя ключа атрибута в первое место, значение атрибута во второе место и диапазон в третье место.

var myRange = NSRange(location: 17, length: 7) // range starting at location 17 with a lenth of 7: "Strings"
myString.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red, range: myRange)

Наконец, давайте добавим цвет фона. Для разнообразия, давайте использоватьaddAttributesметод (обратите внимание наs). Я мог бы добавить несколько атрибутов одновременно с этим методом, но я просто добавлю один снова.

myRange = NSRange(location: 3, length: 17)
let anotherAttribute = [ NSAttributedStringKey.backgroundColor: UIColor.yellow ]
myString.addAttributes(anotherAttribute, range: myRange)

Обратите внимание, что атрибуты перекрываются в некоторых местах. Добавление атрибута не перезаписывает атрибут, который уже существует.

связанные с

Дальнейшее чтение

Swift использует то же самое NSMutableAttributedString что делает Obj-C. Вы создаете его, передавая вычисленное значение в виде строки:

var attributedString = NSMutableAttributedString(string:"\(calculatedCoffee)")

Теперь создайте атрибутированный g Строка (хе). Замечания: UIFont.systemFontOfSize(_) теперь является неудачным инициализатором, поэтому его необходимо развернуть, прежде чем использовать:

var attrs = [NSFontAttributeName : UIFont.systemFontOfSize(19.0)!]
var gString = NSMutableAttributedString(string:"g", attributes:attrs)

И затем добавьте это:

attributedString.appendAttributedString(gString)

Затем вы можете настроить UILabel для отображения NSAttributedString следующим образом:

myLabel.attributedText = attributedString

Я очень рекомендую использовать библиотеку для приписанных строк. Это значительно облегчает задачу, например, если вам нужна одна строка с четырьмя разными цветами и четырьмя разными шрифтами. Вот мой любимый. Это называется SwiftyAttributes

Если вы хотите создать строку с четырьмя разными цветами и разными шрифтами, используя SwiftyAttributes:

let magenta = "Hello ".withAttributes([
    .textColor(.magenta),
    .font(.systemFont(ofSize: 15.0))
    ])
let cyan = "Sir ".withAttributes([
    .textColor(.cyan),
    .font(.boldSystemFont(ofSize: 15.0))
    ])
let green = "Lancelot".withAttributes([
    .textColor(.green),
    .font(.italicSystemFont(ofSize: 15.0))

    ])
let blue = "!".withAttributes([
    .textColor(.blue),
    .font(.preferredFont(forTextStyle: UIFontTextStyle.headline))

    ])
let finalString = magenta + cyan + green + blue

finalString покажет как

Показывает как изображение

Версия Xcode 6:

let attriString = NSAttributedString(string:"attriString", attributes:
[NSForegroundColorAttributeName: UIColor.lightGrayColor(), 
            NSFontAttributeName: AttriFont])

Версия Xcode 9.3:

let attriString = NSAttributedString(string:"attriString", attributes:
[NSAttributedStringKey.foregroundColor: UIColor.lightGray, 
            NSAttributedStringKey.font: AttriFont])

Xcode 10, iOS 12, Swift 4:

let attriString = NSAttributedString(string:"attriString", attributes:
[NSAttributedString.Key.foregroundColor: UIColor.lightGray, 
            NSAttributedString.Key.font: AttriFont])

Swift 5

    let attrStri = NSMutableAttributedString.init(string:"This is red")
    let nsRange = NSString(string: "This is red").range(of: "red", options: String.CompareOptions.caseInsensitive)
    attrStri.addAttributes([NSAttributedString.Key.foregroundColor : UIColor.red, NSAttributedString.Key.font: UIFont.init(name: "PTSans-Regular", size: 15.0) as Any], range: nsRange)
    self.label.attributedText = attrStri

Свифт 4:

let attributes = [NSAttributedStringKey.font: UIFont(name: "HelveticaNeue-Bold", size: 17)!, 
                  NSAttributedStringKey.foregroundColor: UIColor.white]

Swift: xcode 6.1

    let font:UIFont? = UIFont(name: "Arial", size: 12.0)

    let attrString = NSAttributedString(
        string: titleData,
        attributes: NSDictionary(
            object: font!,
            forKey: NSFontAttributeName))

Детали

  • Swift 5.2, Xcode 11.4 (11E146)

Решение

protocol AttributedStringComponent {
    var text: String { get }
    func getAttributes() -> [NSAttributedString.Key: Any]?
}

// MARK: String extensions

extension String: AttributedStringComponent {
    var text: String { self }
    func getAttributes() -> [NSAttributedString.Key: Any]? { return nil }
}

extension String {
    func toAttributed(with attributes: [NSAttributedString.Key: Any]?) -> NSAttributedString {
        .init(string: self, attributes: attributes)
    }
}

// MARK: NSAttributedString extensions

extension NSAttributedString: AttributedStringComponent {
    var text: String { string }

    func getAttributes() -> [Key: Any]? {
        if string.isEmpty { return nil }
        var range = NSRange(location: 0, length: string.count)
        return attributes(at: 0, effectiveRange: &range)
    }
}

extension NSAttributedString {

    convenience init?(from attributedStringComponents: [AttributedStringComponent],
                      defaultAttributes: [NSAttributedString.Key: Any],
                      joinedSeparator: String = " ") {
        switch attributedStringComponents.count {
        case 0: return nil
        default:
            var joinedString = ""
            typealias SttributedStringComponentDescriptor = ([NSAttributedString.Key: Any], NSRange)
            let sttributedStringComponents = attributedStringComponents.enumerated().flatMap { (index, component) -> [SttributedStringComponentDescriptor] in
                var components = [SttributedStringComponentDescriptor]()
                if index != 0 {
                    components.append((defaultAttributes,
                                       NSRange(location: joinedString.count, length: joinedSeparator.count)))
                    joinedString += joinedSeparator
                }
                components.append((component.getAttributes() ?? defaultAttributes,
                                   NSRange(location: joinedString.count, length: component.text.count)))
                joinedString += component.text
                return components
            }

            let attributedString = NSMutableAttributedString(string: joinedString)
            sttributedStringComponents.forEach { attributedString.addAttributes($0, range: $1) }
            self.init(attributedString: attributedString)
        }
    }
}

Применение

let defaultAttributes = [
    .font: UIFont.systemFont(ofSize: 16, weight: .regular),
    .foregroundColor: UIColor.blue
] as [NSAttributedString.Key : Any]

let marketingAttributes = [
    .font: UIFont.systemFont(ofSize: 20.0, weight: .bold),
    .foregroundColor: UIColor.black
] as [NSAttributedString.Key : Any]

let attributedStringComponents = [
    "pay for",
    NSAttributedString(string: "one",
                       attributes: marketingAttributes),
    "and get",
    "three!\n".toAttributed(with: marketingAttributes),
    "Only today!".toAttributed(with: [
        .font: UIFont.systemFont(ofSize: 16.0, weight: .bold),
        .foregroundColor: UIColor.red
    ])
] as [AttributedStringComponent]
let attributedText = NSAttributedString(from: attributedStringComponents, defaultAttributes: defaultAttributes)

Полный пример

не забудьте вставить сюда код решения

import UIKit

class ViewController: UIViewController {

    private weak var label: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        let label = UILabel(frame: .init(x: 40, y: 40, width: 300, height: 80))
        label.numberOfLines = 2
        view.addSubview(label)
        self.label = label

        let defaultAttributes = [
            .font: UIFont.systemFont(ofSize: 16, weight: .regular),
            .foregroundColor: UIColor.blue
        ] as [NSAttributedString.Key : Any]

        let marketingAttributes = [
            .font: UIFont.systemFont(ofSize: 20.0, weight: .bold),
            .foregroundColor: UIColor.black
        ] as [NSAttributedString.Key : Any]

        let attributedStringComponents = [
            "pay for",
            NSAttributedString(string: "one",
                               attributes: marketingAttributes),
            "and get",
            "three!\n".toAttributed(with: marketingAttributes),
            "Only today!".toAttributed(with: [
                .font: UIFont.systemFont(ofSize: 16.0, weight: .bold),
                .foregroundColor: UIColor.red
            ])
        ] as [AttributedStringComponent]
        label.attributedText = NSAttributedString(from: attributedStringComponents, defaultAttributes: defaultAttributes)
        label.textAlignment = .center
    }
}

Результат

Swift 2.0

Вот образец:

let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleDouble.rawValue], range: NSMakeRange(4, 4))
sampleLabel.attributedText = newsString.copy() as? NSAttributedString

ИЛИ ЖЕ

let stringAttributes = [
    NSFontAttributeName : UIFont(name: "Helvetica Neue", size: 17.0)!,
    NSUnderlineStyleAttributeName : 1,
    NSForegroundColorAttributeName : UIColor.orangeColor(),
    NSTextEffectAttributeName : NSTextEffectLetterpressStyle,
    NSStrokeWidthAttributeName : 2.0]
let atrributedString = NSAttributedString(string: "Sample String: Attributed", attributes: stringAttributes)
sampleLabel.attributedText = atrributedString

Лучший способ приблизиться к Attributed Strings на iOS - это использовать встроенный текстовый редактор Attributed Text в конструкторе интерфейса и избежать ненужного жесткого кодирования NSAtrributedStringKeys в ваших исходных файлах.

Позже вы можете динамически заменять placehoderls во время выполнения, используя это расширение:

extension NSAttributedString {
    func replacing(placeholder:String, with valueString:String) -> NSAttributedString {

        if let range = self.string.range(of:placeholder) {
            let nsRange = NSRange(range,in:valueString)
            let mutableText = NSMutableAttributedString(attributedString: self)
            mutableText.replaceCharacters(in: nsRange, with: valueString)
            return mutableText as NSAttributedString
        }
        return self
    }
}

Добавьте метку раскадровки с атрибутивным текстом, который выглядит следующим образом.

Затем вы просто обновляете значение каждый раз, когда вам это нужно:

label.attributedText = initalAttributedString.replacing(placeholder: "<price>", with: newValue)

Обязательно сохраните в initalAttributedString исходное значение.

Вы можете лучше понять этот подход, прочитав эту статью: https://medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173e

Я создал онлайн-инструмент, который решит вашу проблему! Вы можете написать свою строку и применить стили в графическом виде, и инструмент предоставит вам код target-c и swift для генерации этой строки.

Также с открытым исходным кодом, так что не стесняйтесь расширять его и отправлять PR.

Инструмент Трансформер

Github

введите описание изображения здесь

Хорошо работает в бета 6

let attrString = NSAttributedString(
    string: "title-title-title",
    attributes: NSDictionary(
       object: NSFont(name: "Arial", size: 12.0), 
       forKey: NSFontAttributeName))

Swift 5 и выше

   let attributedString = NSAttributedString(string:"targetString",
                                   attributes:[NSAttributedString.Key.foregroundColor: UIColor.lightGray,
                                               NSAttributedString.Key.font: UIFont(name: "Arial", size: 18.0) as Any])

Свифт 3,4,5

Используйте приведенный ниже код для цвета текста, шрифта, цвета фона и цвета подчеркивания/подчеркивания.

          let text = "swift is language"
    let attributes = [NSAttributedString.Key.foregroundColor: UIColor.red, NSAttributedString.Key.backgroundColor: UIColor.blue,NSAttributedString.Key.font: UIFont.systemFont(ofSize: 25.0),NSAttributedString.Key.underlineColor: UIColor.white,NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue] as [NSAttributedString.Key : Any]
        
    let textAttribute = NSAttributedString(string: text, attributes: attributes)
    swiftLabel1.attributedText = textAttribute

func decorateText(sub:String, des:String)->NSAttributedString{
    let textAttributesOne = [NSAttributedStringKey.foregroundColor: UIColor.darkText, NSAttributedStringKey.font: UIFont(name: "PTSans-Bold", size: 17.0)!]
    let textAttributesTwo = [NSAttributedStringKey.foregroundColor: UIColor.black, NSAttributedStringKey.font: UIFont(name: "PTSans-Regular", size: 14.0)!]

    let textPartOne = NSMutableAttributedString(string: sub, attributes: textAttributesOne)
    let textPartTwo = NSMutableAttributedString(string: des, attributes: textAttributesTwo)

    let textCombination = NSMutableAttributedString()
    textCombination.append(textPartOne)
    textCombination.append(textPartTwo)
    return textCombination
}

//Реализация

cell.lblFrom.attributedText = decorateText(sub: sender!, des: " - \(convertDateFormatShort3(myDateString: datetime!))")

Используйте этот пример кода. Это очень короткий код, соответствующий вашим требованиям. Это работает для меня.

let attributes = [NSAttributedStringKey.font : UIFont(name: CustomFont.NAME_REGULAR.rawValue, size: CustomFontSize.SURVEY_FORM_LABEL_SIZE.rawValue)!]

let attributedString : NSAttributedString = NSAttributedString(string: messageString, attributes: attributes)

Swift 4

let attributes = [NSAttributedStringKey.font : UIFont(name: CustomFont.NAME_REGULAR.rawValue, size: CustomFontSize.SURVEY_FORM_LABEL_SIZE.rawValue)!]

let attributedString : NSAttributedString = NSAttributedString(string: messageString, attributes: attributes)

Вам нужно удалить необработанное значение в swift 4

Для меня вышеупомянутые решения не работали при установке определенного цвета или свойства.

Это сработало:

let attributes = [
    NSFontAttributeName : UIFont(name: "Helvetica Neue", size: 12.0)!,
    NSUnderlineStyleAttributeName : 1,
    NSForegroundColorAttributeName : UIColor.darkGrayColor(),
    NSTextEffectAttributeName : NSTextEffectLetterpressStyle,
    NSStrokeWidthAttributeName : 3.0]

var atriString = NSAttributedString(string: "My Attributed String", attributes: attributes)

Я сделал функцию, которая принимает массив строк и возвращает строку с атрибутами с указанными вами атрибутами.

      func createAttributedString(stringArray: [String], attributedPart: Int, attributes: [NSAttributedString.Key: Any]) -> NSMutableAttributedString? {
    let finalString = NSMutableAttributedString()
    for i in 0 ..< stringArray.count {
        var attributedString = NSMutableAttributedString(string: stringArray[i], attributes: nil)
        if i == attributedPart {
            attributedString = NSMutableAttributedString(string: attributedString.string, attributes: attributes)
            finalString.append(attributedString)
        } else {
            finalString.append(attributedString)
        }
    }
    return finalString
}

В приведенном выше примере вы указываете, какой части строки вы хотите присвоить атрибут attributedPart: Int

А затем вы задаете для него атрибуты с атрибутами: [NSAttributedString.Key: Any]

ПРИМЕР ИСПОЛЬЗОВАНИЯ

      if let attributedString = createAttributedString(stringArray: ["Hello ", "how ", " are you?"], attributedPart: 2, attributes: [NSAttributedString.Key.foregroundColor: UIColor.systemYellow]) {
      myLabel.attributedText = attributedString
}

Сделаю:

Swift 2.1 - Xcode 7

let labelFont = UIFont(name: "HelveticaNeue-Bold", size: 18)
let attributes :[String:AnyObject] = [NSFontAttributeName : labelFont!]
let attrString = NSAttributedString(string:"foo", attributes: attributes)
myLabel.attributedText = attrString

Swift 4.2

extension UILabel {

    func boldSubstring(_ substr: String) {
        guard substr.isEmpty == false,
            let text = attributedText,
            let range = text.string.range(of: substr, options: .caseInsensitive) else {
                return
        }
        let attr = NSMutableAttributedString(attributedString: text)
        let start = text.string.distance(from: text.string.startIndex, to: range.lowerBound)
        let length = text.string.distance(from: range.lowerBound, to: range.upperBound)
        attr.addAttributes([NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: self.font.pointSize)],
                           range: NSMakeRange(start, length))
        attributedText = attr
    }
}

Атрибуты могут быть установлены непосредственно в Swift 3...

    let attributes = NSAttributedString(string: "String", attributes: [NSFontAttributeName : UIFont(name: "AvenirNext-Medium", size: 30)!,
         NSForegroundColorAttributeName : UIColor .white,
         NSTextEffectAttributeName : NSTextEffectLetterpressStyle])

Затем используйте переменную в любом классе с атрибутами

 let attrString = NSAttributedString (
            string: "title-title-title",
            attributes: [NSAttributedStringKey.foregroundColor: UIColor.black])
extension UILabel{
    func setSubTextColor(pSubString : String, pColor : UIColor){    
        let attributedString: NSMutableAttributedString = self.attributedText != nil ? NSMutableAttributedString(attributedString: self.attributedText!) : NSMutableAttributedString(string: self.text!);

        let range = attributedString.mutableString.range(of: pSubString, options:NSString.CompareOptions.caseInsensitive)
        if range.location != NSNotFound {
            attributedString.addAttribute(NSForegroundColorAttributeName, value: pColor, range: range);
        }
        self.attributedText = attributedString
    }
}

Swifter Swift предлагает довольно приятный способ сделать это безо всякой работы. Просто предоставьте шаблон, который должен соответствовать, и какие атрибуты применить к нему. Они отлично подходят для многих вещей, проверьте их.

``` Swift
let defaultGenreText = NSAttributedString(string: "Select Genre - Required")
let redGenreText = defaultGenreText.applying(attributes: [NSAttributedString.Key.foregroundColor : UIColor.red], toRangesMatching: "Required")
``

Если у вас есть несколько мест, где это будет применяться, и вы хотите, чтобы это происходило только в определенных случаях, этот метод не сработает.

Вы можете сделать это за один шаг, просто легче читать, когда разделены.

Будет действительно легко решить вашу проблему с библиотекой, которую я создал. Это называется Атрибутика.

let calculatedCoffee: Int = 768
let g = Style("g").font(.boldSystemFont(ofSize: 12)).foregroundColor(.red)
let all = Style.font(.systemFont(ofSize: 12))

let str = "\(calculatedCoffee)<g>g</g>".style(tags: g)
    .styleAll(all)
    .attributedString

label.attributedText = str

768g

Вы можете найти его здесь https://github.com/psharanda/Atributika

Swift 4.x

let attr = [NSForegroundColorAttributeName:self.configuration.settingsColor, NSFontAttributeName: self.configuration.settingsFont]

let title = NSAttributedString(string: self.configuration.settingsTitle,
                               attributes: attr)

Пожалуйста, рассмотрите возможность использования Prestyler

import Prestyler
...
Prestyle.defineRule("$", UIColor.red)
label.attributedText = "\(calculatedCoffee) $g$".prestyled()

Swift 3.0 // создаем приписанную строку

Определите атрибуты как

let attributes = [NSAttributedStringKey.font : UIFont.init(name: "Avenir-Medium", size: 13.0)]

Objective C 2.0 Пример:

          myUILabel.text = @"€ 60,00";
    NSMutableAttributedString *amountText = [[NSMutableAttributedString alloc] initWithString:myUILabel.text];
    
    //Add attributes you are looking for
    NSDictionary *dictionaryOfAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                            [UIFont systemFontOfSize:12],NSFontAttributeName,
                                            [UIColor grayColor],NSForegroundColorAttributeName,
                                            nil];
    
    //Will gray color and resize the € symbol
    [amountText setAttributes:dictionaryOfAttributes range:NSMakeRange(0, 1)];
    myUILabel.attributedText = amountText;
Другие вопросы по тегам