在textView的HTML属性文本上填充CSS不起作用

Nit*_*esh 7 uitextview nsattributedstring swift

我正在使用HTML内容呈现textview.我已经采用了一些"div"标签并在其上应用了一些CSS.我在使用CSS类在"div"上应用填充时遇到了一个问题,该类在textview上渲染后没有反映div.我使用以下方法将HTML内容字符串转换为属性字符串.

if let htmlData = htmlContent.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true) {
    do {
        return try NSMutableAttributedString(
                       data: htmlData,
                       options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
                       documentAttributes: nil)
    }
    catch let error as NSError {
        printDebuggingMode("Couldn't translate \(htmlContent): \(error.localizedDescription) ")
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望在textView的图像中实现下面附带的类似内容.

.padding {
    padding-left: 20px;
}
Run Code Online (Sandbox Code Playgroud)

小智 1

问题是UITextView不支持HTML 内容内的填充属性。考虑到这一点,您有两个选择:

一方面,UIWebView按照回复中的建议使用 。您将具有与 中相同的功能UITextView,但您必须使用如下所示的方法来计算文本的高度:

此方法返回高度而不考虑 的插入UITextView,您稍后需要添加它们。

func heightForText(text: String?, width: CGFloat) -> CGFloat {

    //Get attributed text from string
    let attributedText = text?.toHtmlTextWithAttributes()

    if let attributedText = attributedText {
        let rect = attributedText.boundingRectWithSize(
            CGSizeMake(width, CGFloat.max),
            options: [.UsesLineFragmentOrigin, .UsesFontLeading],
            context: nil)
        return rect.height
    }

    //Return any default height
    return 100
}
Run Code Online (Sandbox Code Playgroud)

这是String将文本转换为NSAttributedString.

extension String {
    public func toHtmlTextWithAttributes() -> NSAttributedString? {

        let encodedData = self.dataUsingEncoding(NSUTF8StringEncoding)

        if let data = encodedData {

            let paragrahpStyle = NSMutableParagraphStyle()
            paragrahpStyle.lineBreakMode = .ByWordWrapping
            let attributes: [String: NSObject] = [
                NSParagraphStyleAttributeName: paragrahpStyle,
                NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding
            ]

            return try! NSAttributedString(data: data, options: attributes, documentAttributes: nil)
        }

        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,不建议使用UITableViewAutomaticDimension ,因为在相当大的列表中,它可能会导致性能问题。

另一方面,如果您UITextView确实需要使用,您可以解析 html,提取标题和段落并将它们显示在两个单独的UITextView. 这样你就可以UITextView像这样调整第二个的插入:

textView.textContainerInset = UIEdgeInsetsMake(0, 20, 0, 0)
Run Code Online (Sandbox Code Playgroud)