2016-08-19 4 views
6

Я обрабатываю текстовое изображение с содержимым HTML. Я взял некоторые теги «div» и применил к ним некоторый CSS. Я столкнулся с проблемой при применении дополнения к «div» с использованием класса CSS, который не отражается на div после рендеринга в textview. Я использовал следующий метод для преобразования строки содержимого HTML в атрибутированную строку.Прошивка через CSS на HTML, приписываемый текст для textView не работает

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

Я хочу добиться чего-то подобного, как показано ниже на изображении в textView.

.padding { 
    padding-left: 20px; 
} 
+0

HTML для 'NSAttributedString' работает действительно только для легких преобразований. Для краткого обсуждения этого см. [Здесь] (http://ericasadun.com/2015/08/24/css-and-attributed-strings/). Вы пытались использовать 'UIWebView' или' WKWebView'? – beyowulf

+0

@beyowulf, на самом деле у меня есть требование показать некоторый раздел содержимого html мудрый, поэтому я взял textview внутри tableviewCell. так что каждый раздел с заголовком раздела имеет одно raw внутри него с textview, где я должен отображать html-контент, который также имеет css. Я взял textview, потому что 1. uiTableViewAutomaticDimension делает строку высотой регулируемой в соответствии с содержимым текста, 2. я должен предоставить выбор текста для выделения. – Nitesh

+0

Хорошо. Ну, 'UITextView', например' UIWebView' и 'WKWebView', не имеет собственного размера содержимого, поэтому я не уверен, что это полезно для автоматического измерения. И текст можно выбирать, но не редактировать, в веб-представлениях. – beyowulf

ответ

0

Проблема заключается в том, что 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 
} 

Вот 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 
    } 
} 

Кроме того, использование UITableViewAutomaticDimension не рекомендуется, потому что в очень больших списков может привести к проблемам производительности.

С другой стороны, если вам нужно использовать UITextView, вы можете проанализировать html, извлечь заголовок и абзац и отобразить их в двух разделенных UITextView. Таким образом, вы будете иметь возможность регулировать врезки второго UITextView как это:

textView.textContainerInset = UIEdgeInsetsMake(0, 20, 0, 0) 

 Смежные вопросы

  • Нет связанных вопросов^_^