Создать атрибутивный текст значений заполнителя в строке - PullRequest
0 голосов
/ 27 июня 2019

Я получил это String:

let someString = String(format: NSLocalizedString("%1$@ changed your user role %2$@.", comment: ""), username, userRole)

Я хочу сделать userRole жирным. Это можно сделать с помощью NSMutableAttributedString. Для выполнения этой задачи, я думаю, необходимо создать диапазоны заменяемого текста. Я не знаю, как это сделать, кроме добавления тегов, таких как теги HTML, для определения заполнителей. Я не хочу использовать теги, потому что для этого потребуются проверки на стороне клиента / сервера и многое другое.

Есть ли способ получить замененный текстовый диапазон второго аргумента? Простого поиска заполнителя в someString недостаточно, потому что, например, если роль пользователя равна переведенному тексту перед заполнителем, я получаю неправильный диапазон.

Я хочу, чтобы в будущем можно было связать текст с заполнителями.

1 Ответ

0 голосов
/ 27 июня 2019

Раньше мне приходилось делать именно это по соображениям удобства.Моя стратегия состояла в том, чтобы создать подкласс UILabel, а затем переопределить элемент text, изменить текст и установить attributedText метки (фактически перезаписывая исходный текст).Примерно так:

/// Custom label that autoformats its text content. Use "@" to denote bolded ranges.
class AutoformatLabel: UILabel {

    // The special char that denotes bolded ranges.
    private let kSpecialChar: String = "@"
    // Set your font size and which fonts you want to use for bold/regular, here.
    var boldedFont = UIFont.boldSystemFont(ofSize: 18.0)
    var regularFont = UIFont.systemFont(ofSize: 18.0)


    /// Usage:
    ///     label.text = "Regular text @bolded text@ back to regular"
    public override var text: String? {
        didSet {
            let attributedText = NSMutableAttributedString(string: "")
            let paragraphStyle = NSMutableParagraphStyle()
            // Add things like line spacing, etc. to your paragraphStyle here, if desired.
            paragraphStyle.alignment = self.textAlignment
            let phrases = text!.split(separator: kSpecialChar)
            for i in 0...(phrases.count - 1) {
                let attPhrase = NSMutableAttributedString(string: String(phrases[i]))
                if i % 2 != 0 {
                    attPhrase.addAttribute(NSAttributedStringKey.font, value: boldedFont, range: NSRange(location: 0, length: attPhrase.length))
                } else {
                    attPhrase.addAttribute(NSAttributedStringKey.font, value: regularFont, range: NSRange(location: 0, length: attPhrase.length))
                }
                attributedText.append(attPhrase)
            }
            attributedText.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: NSMakeRange(0, attributedText.length - 1))
            self.attributedText = attributedText
        }
    }

}

Вы можете изменить, какой символ вы хотите использовать для обозначения жирных диапазонов, установив постоянную kSpecialChar на любое значение.Надеюсь, что это поможет!


РЕДАКТИРОВАТЬ: Неправильный вопрос!Вот фрагмент кода, который вы ищете:

let text = "changed your user role"
let boldedText = "user"
let boldedRange = text.range(of: "user")
let attributedText = NSMutableAttributedString(string: text)
attributedText.addAttribute(NSAttributedStringKey.font, value: boldedFont, range: NSRange(location: boldedRange.lowerBound, length: boldedRange.upperBound - boldedRange.lowerBound))

myLabel.attributedText = attributedText
...