Применение NSMutableAttributedString к диапазону текста

У меня есть текст:

Новый контент — опубликован сегодня | 10 минут чтения

Я хотел бы применить стили ко всему, кроме трубы, поэтому | 10 min read

Я пробовал ниже, но у него есть только стили самой трубы.

  func makeAttributedText(using baseString: String?) -> NSMutableAttributedString? {
    guard let baseString = baseString else { return nil }
    let attributedString = NSMutableAttributedString(string: baseString, attributes: nil)
    let timeToReadRange = (attributedString.string as NSString).range(of: "|")
    attributedString.setAttributes([NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 18)], range: timeToReadRange)
    return attributedString
  }

person Harry Blue    schedule 01.06.2020    source источник
comment
как timeToReadRange вы определяете только диапазон | (attributedString.string as NSString).range(of: "|")Вы должны создать диапазон, начиная с | до конца индекса.   -  person Ömer Faruk Öztürk    schedule 01.06.2020
comment
Вот и не знаю как сделать   -  person Harry Blue    schedule 01.06.2020


Ответы (1)


Вместо получения диапазона одного символа получите индекс символа и создайте диапазон от этого индекса до конца строки.

func makeAttributedText(using baseString: String?) -> NSMutableAttributedString? {
    guard let baseString = baseString else { return nil }
    let attributedString = NSMutableAttributedString(string: baseString, attributes: nil)
    guard let timeToReadIndex = baseString.firstIndex(of: "|") else { return attributedString }
    let timeToReadRange = NSRange(timeToReadIndex..., in: baseString)
    attributedString.setAttributes([NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 18)], range: timeToReadRange)
    return attributedString
}

Примечание:

В Swift есть специальные методы для преобразования Range<String.Index> в NSRange. Нет причин перекидывать мост на NSString

person vadian    schedule 01.06.2020