2016-10-12 28 views
0

(SWIFT使用)のUIWebViewを使用せずにiOSの10でHTMLタグのテキストを表示する方法:私は以下の問題の解決策を探しています現在

問題:私は<b></b>のようなHTMLタグでテキストを受け付けております 、<table><tr><td></td></tr></table>などJSONレスポンスとして。 このデータをiOS(iphone)アプリのUIにレンダリングする必要があります。このデータがウェブビューにマップされている場合は、希望する方法でデータを表す必要があります。すなわち、HTMLタグごとにテキスト<b>bold</b><table><tr><td>**draw table**</table></tr></td>を作成する必要があります。

私はSwift 3でXcode 8を使用しています。

ソリューション:??

+0

の一部であり、あなたは適切なJSONデータを取得する必要があります。 HTMLからの応答を取得するためのコードを作成することもできます.HTML解析として呼び出すこともできますが、モバイルアプリではあまり適していません。レスポンスから余分なHTMLタグを削除することができれば、JSONレスポンスは問題ありません。 – Wolverine

+0

あなたは[この回答](http://stackoverflow.com/questions/31080818/what-is-the-best-practice-to-parse-html-in-swift)をチェックしたいかもしれません –

+0

@Wolverineここに私の目的はありますか?データ内のHTMLタグごとにテキストを表示します。だからテーブルタグがあればそれはテーブルなどを描画する必要があります – AjDev

答えて

3

アプローチは常に同じです:ビュー/コントロール/のTextViewにAttributedStringの 2.セットに 1ターンのhtml ..どんな

この情報がお役に立てば幸いです。私はすべての時間

import UIKit 

public extension UIButton { 
    public func setHTMLTitle(title: NSString?, for state: UIControlState) { 
     guard let title = title else { 
      setTitle(nil, for: state) 
      return 
     } 

     guard let titleLabel = titleLabel else { 
      setTitle(nil, for: state) 
      return 
     } 

     if titleLabel.font == nil { 
      titleLabel.font = UIFont.systemFont(ofSize:UIFont.systemFontSize) 
     } 

     var c = titleColor(for: state) 
     if c == nil { 
      c = UIColor.black 
      setTitleColor(c, for: state) 
     } 

     setAttributedTitle(html(html: title, font: titleLabel.font, color: c!), for: state) 
    } 
} 

public extension UILabel { 
    public func setHTMLText(text: NSString?) { 
     guard let text = text else { 
      attributedText = nil 
      return 
     } 

     if font == nil { 
      font = UIFont.systemFont(ofSize:UIFont.systemFontSize) 
     } 
     if textColor == nil { 
      textColor = UIColor.black 
     } 

     attributedText = html(html: text, font: font, color: textColor) 
    } 
} 

public extension UITextView { 
    public func setHTMLText(text: NSString?) { 
     guard let text = text else { 
      attributedText = nil 
      return 
     } 

     if font == nil { 
      font = UIFont.systemFont(ofSize:UIFont.systemFontSize) 
     } 
     if textColor == nil { 
      textColor = UIColor.black 
     } 

     attributedText = html(html: text, font:font!, color:textColor!) 
    } 
} 

//shared helpers 

private func html(html:NSString, font:UIFont, color:UIColor) -> NSAttributedString { 
    let colorName = colorToHexString(color: color) 
    let fontName = font.fontName 
    let fontSize = font.pointSize 

    let style = "<style>body{color: \(colorName); font-family: '\(fontName)'; font-size:\(fontSize)px;}</style>" 
    let htmlString = html.appending(style) 
    let d = htmlString.data(using: String.Encoding.utf8)! 

    let o = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType as AnyObject, NSCharacterEncodingDocumentAttribute: NSNumber(value: String.Encoding.utf8.rawValue) as AnyObject] as [String:AnyObject] 

    do { 
     let attrStr = try NSAttributedString(data:d, options:o, documentAttributes:nil) 
     return attrStr 
    } 
    catch { 
     return NSAttributedString(string: "") 
    } 
} 

private func colorToHexString(color: UIColor) -> String { 
    var r:CGFloat = 0 
    var g:CGFloat = 0 
    var b:CGFloat = 0 
    var a:CGFloat = 0 

    color.getRed(&r, green: &g, blue: &b, alpha: &a) 

    let rgb:Int = (Int)(r*255)<<16 | (Int)(g*255)<<8 | (Int)(b*255)<<0 

    return String(format:"#%06x", rgb) 
} 

***免責それを使用し、これは適切な解析のための私のオープンソースライブラリDDUtils

+0

HTMLをそのような帰属文字列に変換できるかどうか分かりませんでした。 – vtcajones

関連する問題