Изменение шрифта для неупорядоченного списка для Swift NSAttributedString - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь создать NSAttributedString из строки HTML, но мне нужно изменить шрифт строки.Я смог успешно добиться этого, выполнив:

let myOriginalString: String = "<!DOCTYPE html>
                    <head>
                      <style type=\"text/css\">
                        body{font-family: '-apple-system','Avenir-Medium',`Avenir-Black`; font-size:14;}
                      </style>
                    <body>
                      My HTML content
                    </body>"

let data: Data = myOriginalString.data(using: .utf8)

let myConvertedString: NSAttributedString = NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)

Когда на экране отображается myConvertedString, текст отображается правильным шрифтом.

Но когда я пытаюсь выполнить то же преобразование, когда тело HTML содержит неупорядоченный список , содержимое в неупорядоченном списке не соответствует указанному мной формату:

let myOriginalString: String = "<!DOCTYPE html>
                    <head>
                      <style type=\"text/css\">
                        body{font-family: '-apple-system','Avenir-Medium',`Avenir-Black`; font-size:14;}
                      </style>
                    <body>
                      My HTML content
                      <ul>
                        <li>Item 1</li>
                        <li>Item 2</li>
                      </ul>
                    </body>"

let data: Data = myOriginalString.data(using: .utf8)

let myConvertedString: NSAttributedString = NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)

Когда на экране отображается myConvertedString, строка My HTML Content имеет правильный формат, но Item 1 и Item 2 не соответствуют указанному мной шрифту.

Я попытался добавитьстилизация для тега ul и тега li, но с одинаковым результатом.

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

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Я нашел лучшее решение, чем использование неупорядоченного списка HTML, используя вместо этого NSMutableParagraphStyle:

let myAttributedString = NSMutableAttributedString()

// Create a paragraph style
let paragraphStyle: NSMutableParagraphStyle = NSParagraphStyle.default.mutableCopy() as! NSMutableParagraphStyle
            paragraphStyle.tabStops = [NSTextTab(textAlignment: .left, location: 10, options: [:])]
            paragraphStyle.firstLineHeadIndent = 0
            paragraphStyle.headIndent = 10

let item1 =  NSMutableAttributedString(string: "\u{2022} Item1\n\n", attributes: [.font: UIFont.systemFont(ofSize: 14.0), .paragraphStyle: paragraphStyle])

let item2 =  NSMutableAttributedString(string: "\u{2022} Item2\n\n", attributes: [.font: UIFont.systemFont(ofSize: 14.0), .paragraphStyle: paragraphStyle])

myAttributedString.append(item1)
myAttributedString.append(item2)

Теперь myAttributedString печатает item1 и item2 в правильном шрифте с правильным стилем (переносимые слова не имеют такого же значения minx, что и точка маркера)

Я думаю, что неправильный шрифт имел место в HTML-части, потому что я пытался создать NSAttributedString, которая состояла из некоторой обычной NSAttributedString, HTML-NSAttributedString, за которой следовало большеобычные NSAttributedStrings.Я не думаю, что это должно быть проблемой, возможно, это ошибка ???

0 голосов
/ 23 мая 2018

Я только что попробовал с Arial, и он работает:

override func viewDidLoad() {
        super.viewDidLoad()

        let myOriginalString = """
        <!DOCTYPE html>
        <head>
        <style type="text/css">
        body {
            font-family: Arial;
            font-size: 32px;
            color: red;
        }
        </style>
        <body>
        My HTML content
        <ul>
            <li>Item 1</li>
            <li>Item 2</li>
        </ul>
        </body>
        """

        if let data = myOriginalString.data(using: .utf8) {

            if let converted = try? NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil) {

                textView.attributedText = converted
            }
        }
    }
...