Swift делает текст UILabel жирным между пользовательским идентификатором - PullRequest
0 голосов
/ 31 марта 2020

У меня есть UILabel с текстом

This is not bold, -bold- this is bold, -/bold- and this is another not bold, -bold- this is another bold -/bold-.

Теперь я хочу изменить шрифт текста между каждыми -bold- и -/bold- в тексте, чтобы жирный шрифт, поэтому он станет примерно таким:

Это не жирный шрифт, это жирный шрифт, и это еще один не жирный шрифт, это еще один жирный шрифт .

Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Вы можете использовать NSMutableAttributedString и установить для него свойство UILabel attributedText.

let label = UILabel()
//Choose your bold font
let boldAttributes = [NSFontAttributeName : UIFont.boldSystemFont(ofSize: 15)]
let mutableAttributedString = NSMutableAttributedString()
mutableAttributedString.append(NSAttributedString(string: "Non-bold text #1", attributes: nil))
mutableAttributedString.append(NSAttributedString(string: "Bold text #1", attributes: boldAttributes))
mutableAttributedString.append(NSAttributedString(string: "Non-bold text #2", attributes: nil))
mutableAttributedString.append(NSAttributedString(string: "Bold text #2", attributes: boldAttributes))
label.attributedText = mutableAttributedString
0 голосов
/ 31 марта 2020

Реализация:

Написать расширение для NSMutableAttributedString и реализовать методы для полужирных и обычных строковых атрибутов.

 extension NSMutableAttributedString {


    func bold(_ value:String) -> NSMutableAttributedString {

        let attributes:[NSAttributedString.Key : Any] = [.font : UIFont.boldSystemFont(ofSize: 15)]

        self.append(NSAttributedString(string: value, attributes:attributes))
        return self
    }

    func normal(_ value:String) -> NSMutableAttributedString {

        let attributes:[NSAttributedString.Key : Any] = [.font : UIFont.systemFont(ofSize: 15)]

        self.append(NSAttributedString(string: value, attributes:attributes))
        return self
    }
}

Использование:

textLabel.attributedText = NSMutableAttributedString().normal("This is not bold, ").bold("this is bold, ").normal("and this is another not bold, ").bold("this is another bold.")

Результат: enter image description here

0 голосов
/ 31 марта 2020

Сначала получите строки внутри разделителя.

let query = "This is not bold, -bold- this is bold, -/bold- and this is another not bold, -bold- this is another bold -/bold-"
let regex = try! NSRegularExpression(pattern: "-bold- (.*?) -/bold-", options: [])
var results = [String]()
regex.enumerateMatches(in: query, options: [], range: NSMakeRange(0, query.utf16.count)) { result, flags, stop in

    if let r = result?.range(at: 1),
        let range = Range(r, in: query) {
        results.append(String(query[range]))
    }
}

print(results)

Затем создайте метод расширения строки, как показано ниже.

extension String {

    func attributedString(with style: [NSAttributedString.Key: Any]? = nil,
                          and highlightedTextArray: [String],
                          with highlightedTextStyleArray: [[NSAttributedString.Key: Any]?]) -> NSAttributedString {

        let formattedString = NSMutableAttributedString(string: self, attributes: style)
        if highlightedTextArray.count != highlightedTextStyleArray.count {
            return formattedString
        }

        for (highlightedText, highlightedTextStyle) in zip(highlightedTextArray, highlightedTextStyleArray) {
            let highlightedTextRange: NSRange = (self as NSString).range(of: highlightedText as String)
            formattedString.setAttributes(highlightedTextStyle, range: highlightedTextRange)
        }

        return formattedString
    }
}

Сведения о методе:

  • первый аргумент: стиль шрифта и другие атрибуты, которые должны применяться для полной строки.
  • второй аргумент: массив строк, для которых будет применяться новый стиль.
  • третий аргумент: новый стиль (в данном случае, полужирный), который будет применен.
  • возвращает результат приписанная строка.

Наконец, вызовите метод, как показано ниже.

let attributedText = query.attributedString(with: [.font: UIFont.systemFont(ofSize: 12.0, weight: .regular)],
                       and: results,
                       with: [[.font: UIFont.systemFont(ofSize: 12.0, weight: .bold)]])

Надеюсь, это поможет.

...