NSAttributed
に設定したUITextView
文字列(HTMLから取得)があります。
- (void)setHtml:(NSString *)html {
NSData *htmlData = [html dataUsingEncoding:NSUTF8StringEncoding];
// Create the HTML string
NSDictionary *importParams = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};
NSError *error = nil;
self.htmlString = [[NSAttributedString alloc] initWithData:htmlData options:importParams documentAttributes:NULL error:&error];
self.editorView.attributedText = self.htmlString;
}
次に、ユーザーに必要なものを編集させ、それをもう一度HTMLに変換したいので、次を使用します。
- (NSString *)getHTML {
NSDictionary *exportParams = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};
NSData *htmlData = [self.editorView.attributedText dataFromRange:NSMakeRange(0, self.editorView.attributedText.length) documentAttributes:exportParams error:nil];
return [[NSString alloc] initWithData:htmlData encoding:NSUTF8StringEncoding];
}
HTMLを返しますが、私が望む方法ではありません。すべてにクラス属性が与えられ、それがドキュメントの上部に配置するCSSが与えられます。画像やリンクのようなものは、返されるHTMLにさえ含まれておらず、おそらくもっと多くの問題があります。
NSAttributedString
からHTMLを取得するより良い方法はありますか?または、NSAttributedString
を解析して独自のHTMLを作成する方法はありますか?
そのリポジトリを見ることができるかもしれません: https://github.com/IdeasOnCanvas/Ashton
2つの興味深いクラスがあります:
AshtonHTMLReader.h
- (NSAttributedString *)attributedStringFromHTMLString:(NSString *)htmlString;
そして作家:
AshtonHTMLWriter.h
- (NSString *)HTMLStringFromAttributedString:(NSAttributedString *)input;
生成されたhtmlはあまり良くありませんが、uiwebviewで表示しようとすると、かなり見栄えがします。
画像の簡単なアイデア:base64でエンコードし、適切なフレームの<img>タグに直接配置します。
それは醜いですが、それは機能します=>私は数ヶ月前にいくつかのhtmlファイルを作成して編集するためにこのプロセスを使用しました
これは複雑な問題であり、短い答えから始めます。コメント欄で質問していただければ、必要に応じて回答を拡大していきます。
また、属性付き文字列ルートを使用しようとしましたが、完全なHTML編集には適していないことがわかりました。コンバーターが完全に開発されていないか、これらの要素がAppleによって範囲外と見なされたため、多くの要素がサポートされていません。属性付き文字列は、再作成しようとするまでにHTMLの豊富さのほとんどをすでに失っているため、属性付き文字列の解析は十分ではありません。
代わりに、Webビューを使用し、ドキュメントを通常どおりにロードして、body要素でcontentEditable
を有効にします。これにより、WebKitによってのみ制限され、ドキュメントを最大限に編集できるようになります。最後に、HTMLを取得するために、contentEditable
を無効にし、document.outerHTML
を使用して、ユーザーが変更を加えた以前のHTML全体を取得します。
このメソッドを軽く実装するという決定を下さないでください。これはやや複雑な解決策ですが、確かに可能です。ウェブビューはテキストビューほど素敵ではありませんが、十分なマッサージをすれば可能です。
必要に応じて、この回答を拡張します。
また、プロジェクトの1つでNSAtttributedStringをHTMLに変換する必要がありました。これを行うためのコードは次のとおりです
//self.attributed String is the attributedString
NSDictionary *documentAttributes = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};
NSData *htmlData = [self.attributedString dataFromRange:NSMakeRange(0, self.attributedString.length) documentAttributes:documentAttributes error:NULL];
NSString *htmlString = [[NSString alloc] initWithData:htmlData encoding:NSUTF8StringEncoding];
NSLog(@"%@", htmlString);