web-dev-qa-db-ja.com

iPhoneのAPIからHTMLテキストを表示する方法は?

私の状況を説明する最良の例は、ブログ投稿を使用することです。 APIから取得したブログ投稿のタイトルを読み込んだUITableViewがあるとします。行をクリックすると、詳細なブログ投稿が表示されます。

その際、APIは「投稿本文」(HTMLテキスト)を含むいくつかのフィールドを返します。私の質問は、フォーマットされたHTMLとして表示されるように表示するには何を使用すればよいですか?そのためにUIWebViewを使用する必要がありますか? Webページを文字通り表示するときに(URLなどで初期化するなど)UIWebViewを使用するか、HTML文字列を渡せば適切にフォーマットされるかどうかはわかりません。

タイトル、カテゴリ、作成者など、このページに表示される他のフィールドがいくつかあります。これらにはUILabelsを使用しているだけなので、問題はありません。しかし、HTMLチャンクをどうするかわかりません。ところで、私はこのすべてをプログラムで行っています。

わからない場合、私はiOS開発には比較的慣れておらず、2〜3週間しか経っていません。obj-cのバックグラウンドはありません。したがって、UIWebViewが適切なアプローチである場合、「落とし穴」もありがたいです。メモがあれば。

46
rpheath

David Liuが言ったように、 IWebview が道です。 HTML文字列を個別に作成し、UIWebViewに渡すことをお勧めします。また、[webView setBackgroundColor:[UIColor clearColor]]を使用して背景を透明にします。そうすることで、物事を見た目どおりに見やすくすることができます。

コードサンプルを次に示します。

- (void) createWebViewWithHTML{
    //create the string
    NSMutableString *html = [NSMutableString stringWithString: @"<html><head><title></title></head><body style=\"background:transparent;\">"];

    //continue building the string
    [html appendString:@"body content here"];
    [html appendString:@"</body></html>"];

    //instantiate the web view
    UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.frame];

    //make the background transparent
    [webView setBackgroundColor:[UIColor clearColor]];

    //pass the string to the webview
    [webView loadHTMLString:[html description] baseURL:nil];

    //add it to the subview
    [self.view addSubview:webView];

}

注:

「NSMutableString」を使用する利点は、解析操作全体を通して文字列を構築し続け、「UIWebView」に渡すことができるのに対し、「NSString」は一度作成すると変更できないことです。

54
Moshe
   self.textLbl.attributedText = [[NSAttributedString alloc] initWithData:    [@"html-string" dataUsingEncoding:NSUnicodeStringEncoding]
                                                                          options:@{     NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType
                                                                                     } documentAttributes:nil error:nil];
9
Pedroinpeace
NSString *strForWebView = [NSString stringWithFormat:@"<html> \n"
      "<head> \n"
      "<style type=\"text/css\"> \n"
      "body {font-family: \"%@\"; font-size: %@; height: auto; }\n"
      "</style> \n"
      "</head> \n"
      "<body>%@</body> \n"
      "</html>", @"helvetica", [NSNumber numberWithInt:12], ParameterWhereYouStoreTextFromAPI];


 [self.webview loadHTMLString:strForWebView baseURL:nil];

このコードを使用して、webviewテキストのフォントを設定し、apiから取得したテキストを保存するivar 'ParameterWhereYouStoreTextFromAPI'を渡します。

7
neha

プリミティブHTML(テキストスタイル、p/brタグ)の特殊なケースでは、ドキュメント化されていないプロパティでUITextViewを使用することもできます。

-[UITextView setValue:@"<b>bold</b>" forKey:@"contentToHTMLString"]

文書化されていませんが、私が知っている多くのアプリで使用されており、これまでのところ単一の拒否を引き起こしていません。

6
Ortwin Gentz

UIWebViewのloadHTMLString:baseURL:メソッドを使用できます。

参照リンク: here

4
David Liu

Mosheの答えはすばらしいですが、透明なWebビューが必要な場合は、opaqueプロパティをFALSEに設定する必要があります。

あなたはチェックしたいかもしれません: 透明なUIWebVIewの作り方

2
kraag22

(align、centre、br>)のようなHTML/JSテキストを削除することで表示できます。iOS7.0以上をターゲットにしている場合は、このメソッドを使用してください。

    NSString *htmlFile;

    htmlFile=[array valueForKey:@"results"];

    NSAttributedString *attr = [[NSAttributedString alloc] initWithData:[htmlFile dataUsingEncoding:NSUTF8StringEncoding]options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute:@(NSUTF8StringEncoding)}documentAttributes:nil error:nil];
        NSLog(@"html: %@", htmlFile);
        NSLog(@"attr: %@", attr);
        NSLog(@"string: %@", [attr string]);
        NSString *finalString = [attr string];

        [webView loadHTMLString:[finalString description] baseURL:nil];
0
Anuj Kumar Rai

私のシナリオ:View ControllerにTextviewがあり、HTML形式のtextViewでデータを表示する必要があります。

スウィフト3:

func detectUrlInText() {

let attrStr = try! NSAttributedString(
            data: "<b><i>\(Ldesc)</i></b>".data(using: String.Encoding.unicode, allowLossyConversion: true)!,
            options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
            documentAttributes: nil)

 desc.attributedText = attrStr

 desc.font = UIFont(name: "CALIBRI", size: 14)

}
// Ldesc is the string which gives me the data to put in the textview. desc is my UITextView.
:)
0
Mili