Как установить пользовательский шрифт с обычным и жирным шрифтом при настройке HTML-строки для метки в Swift 4? - PullRequest
0 голосов
/ 20 мая 2019

Я получаю HTML отформатированную строку из ответа API, поэтому мне нужно установить ее в качестве метки, сохраняя пользовательский шрифт (как в моем приложении), а также применяя стиль (полужирный, обычный и т. Д.) Дляметка.

Я использовал расширение, которое позволяет преобразовывать строку HTML в обычную строку с символами новой строки и т. д., но я смог установить здесь шрифт, но только один шрифт, и он отображается обычным шрифтомтолько, так что вся метка написана одним шрифтом, я хочу установить жирный шрифт для жирной части HTML и обычный для обычной HTML part / tag.

extension String {
    var htmlToAttributedString: NSAttributedString {
        guard let data = data(using: .utf8) else { return NSAttributedString() }
        do {
            return try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding:String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch {
            return NSAttributedString()
        }
    }
    var htmlToString: String {
        return htmlToAttributedString.string
    }
}

//set converted html to string here
let whyAttendAttributedText: NSMutableAttributedString = NSMutableAttributedString(attributedString: attendData.whyAttendData?.desc?.htmlToAttributedString ?? NSAttributedString())

//set font here   
whyAttendAttributedText.addAttributes([NSMutableAttributedString.Key.font: CommonSettings.shared.getFont(type: .regular, size: descriptionLabel.font.pointSize), NSMutableAttributedString.Key.foregroundColor: UIColor.white], range: NSMakeRange(0, whyAttendAttributedText.length))

Я хочу установитьжирный и обычный для текста, но так как я установил только один шрифт, я не смог получить результат, есть ли способ установить жирный и обычный шрифт, как в HTML string?

Ответы [ 3 ]

0 голосов
/ 20 мая 2019

Предположим, что ваша строка после разбора HTML-строки: "This is your HTML string"

Для создания attributed string,

let attrStr = NSMutableAttributedString(string: "This is your HTML string")

Добавление атрибута UIFont со значением System-Regular,

attrStr.addAttribute(.font, value: UIFont.systemFont(ofSize: 14.0, weight: .regular), range: NSRange(location: 0, length: attrStr.length))

При добавлении attribute к attributed string нам необходимо указать range из string, в котором мы хотим отразить attribute.

Поскольку нам нужно, чтобы у всего string был шрифт Regular, range вычисляется как целое string length.

Теперь, добавив атрибут UIFont со значением System-Bold для части string, скажем, мы делаем HTML жирным шрифтом,

attrStr.addAttribute(.font, value: UIFont.systemFont(ofSize: 14.0, weight: .bold), range: (attrStr.string as NSString).range(of: "HTML"))

Мы вычислили range слова HTML во всей строке.

Аналогично, вы можете добавить любой из attributes к string, давая соответствующие range значения.

Выход: This is yourHTMLstring

Edit-1:

Чтобы вычислить range из <b> to </b>, вам необходимо вычислить его вручную.

Пример:

let str = "This <b>is your HTML</b> string"
let range1 = (str as NSString).range(of: "<b>")
let range2 = (str as NSString).range(of: "</b>")
let requiredRange = NSRange(location: range1.location, length: range2.location + range2.length - range1.location)

Приведенный выше пример будет работатьk для одного экземпляра <b>/</b> в string.

Edit-2:

Когда string включает несколько экземпляров <b>/</b>:

let htmlStr = "This is an <b>HTML</b> parsed <b>string</b>"
let arr = htmlStr.components(separatedBy: "</b>")
let attrStr = NSMutableAttributedString()
for str in arr {
    if !str.isEmpty {
        let range1 = (str as NSString).range(of: "<b>")
        let requiredRange = NSRange(location: range1.location, length: str.count - range1.location)

        let formattedStr = NSMutableAttributedString(string: str)
        formattedStr.addAttribute(.font, value: UIFont.systemFont(ofSize: 14.0, weight: .bold), range: requiredRange)
        attrStr.append(formattedStr)
        attrStr.append(NSAttributedString.init(string: "</b>", attributes: [.font : UIFont.systemFont(ofSize: 14.0, weight: .bold)]))
    }
}
self.label.attributedText = attrStr

Выход: This is an<b>HTML</b>parsed<b>string</b>

0 голосов
/ 20 мая 2019

Это должно помочь:

extension String {

func attributedString(withRegularFont regularFont: UIFont, andBoldFont boldFont: UIFont) -> NSMutableAttributedString {
    var attributedString = NSMutableAttributedString()
        guard let data = self.data(using: .utf8) else { return NSMutableAttributedString() }
        do {
            attributedString = try NSMutableAttributedString(data: data,
                                                             options: [.documentType: NSAttributedString.DocumentType.html,
                                                                       .characterEncoding:String.Encoding.utf8.rawValue],
                                                             documentAttributes: nil)
            let range = NSRange(location: 0, length: attributedString.length)
            attributedString.enumerateAttribute(NSAttributedString.Key.font, in: range, options: .longestEffectiveRangeNotRequired) { value, range, _ in
                let currentFont: UIFont         = value as! UIFont
                var replacementFont: UIFont?    = nil

                if currentFont.fontName.contains("bold") || currentFont.fontName.contains("Bold") {
                    replacementFont             =   boldFont
                } else {
                    replacementFont             =   regularFont
                }

                let replacementAttribute        =   [NSAttributedString.Key.font:replacementFont!]
                attributedString.addAttributes(replacementAttribute, range: range)
            }
        } catch let e {
            print(e.localizedDescription)
        }
       return attributedString
}
}
0 голосов
/ 20 мая 2019

Применение Bold и других различных стилей к тексту может быть выполнено с использованием метода ниже.

extension String {

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

        let formattedString = NSMutableAttributedString(string: self, attributes: style)
        let highlightedTextRange: NSRange = (self as NSString).range(of: highlightedText as String)
        formattedString.setAttributes(highlightedTextStyle, range: highlightedTextRange)
        return formattedString
    }
}

Ввод: «Это тестовое сообщение»

Ожидаемый вывод: «Это тест сообщение»

Это может быть достигнуто следующим образом.

let sampleInput = "This is a test message"
let boldtext = "test"

let output = sampleInput.attributedString(with: [.font: UIFont.systemFont(ofSize: 12.0, weight: .regular)],
                             and: boldtext, with: UIFont.systemFont(ofSize: 12.0, weight: .bold))

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

...