Как сохранить формат преобразованного HTML в attributeString? - PullRequest
0 голосов
/ 01 октября 2019

У меня есть преобразованный attributeText из HTML. Стили были сохранены, например, полужирный или обычный, но формат не был (заголовок 1, заголовок 2 и т. Д.). Для текста были заданы разные заголовки, но выходные данные UILabel игнорируют это и выдают одинаковый размер.

Это предполагаемый формат из API. Вы можете видеть, что тексты 11111111111 меньше, чем 222222222222.

Когда вы видите вывод в iPhone 5S, заголовки игнорировались.

Это вывод в iPhone5S. 11111111111 и 2222222222 имеют одинаковый размер, даже если они в другом формате

Формат 1111111111 - заголовок 1, а 22222222222 - заголовок 2.

Вот код, который я использовал дляпреобразуйте HTML в attributeString и измените стиль шрифта:

import Foundation
import UIKit

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()
        }
    }

}

extension NSMutableAttributedString {
    func setFontFace(font: UIFont, color: UIColor? = nil) {
        beginEditing()
        self.enumerateAttribute(
            .font,
            in: NSRange(location: 0, length: self.length)
        ) { (value, range, stop) in

            if let f = value as? UIFont,
                let newFontDescriptor = f.fontDescriptor
                    .withFamily(font.familyName)
                    .withSymbolicTraits(f.fontDescriptor.symbolicTraits) {

                let newFont = UIFont(
                    descriptor: newFontDescriptor,
                    size: font.pointSize
                )
                removeAttribute(.font, range: range)
                addAttribute(.font, value: newFont, range: range)
                if let color = color {
                    removeAttribute(
                        .foregroundColor,
                        range: range
                    )
                    addAttribute(
                        .foregroundColor,
                        value: color,
                        range: range
                    )
                }
            }
        }
        endEditing()
    }
}




import ImageViewer
import UIKit

class HomeDetailsViewController: UIViewController {

    // MARK: - Stored

private var feed: Feed?

private func showFeedDetails() {
    categoryName.text = feed?.category
    dateLabel.text = feed?.datePosted
    let mutableAttributedString = NSMutableAttributedString.init(attributedString: (feed?.body?.htmlToAttributedString)!); mutableAttributedString.setFontFace(font: UIFont(name: "Raleway", size: 13)!);
    detailsLabel.attributedText = mutableAttributedString
    collectionView.reloadData()
    startCollectionViewTimer()
}
}

Вот модель:

import Foundation

struct Feed: Codable {

    var id: Int
    var title: String?
    var category: String?
    var imageList: [String]?
    var bodyPreview: String?
    var body: String?
    var datePosted: String?
    var youtubeLink: String?

    private enum CodingKeys: String, CodingKey {
        case id
        case title
        case category
        case imageList = "images_url"
        case bodyPreview = "preview_body"
        case body
        case datePosted = "date_posted"
        case youtubeLink = "youtube_link"
    }

}
...