iOS NSAttributedString HTML
Ich habe eine NSAttributed
string (aus HTML), den ich für eine UITextView
.
- (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;
}
Dann lass ich den user Bearbeiten, was Sie wollen, und ich möchte dann konvertieren Sie es aus, um HTML wieder, also ich benutze:
- (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];
}
Zurückgegeben HTML, ist es aber nicht, wie ich es will. Alles ist gegeben, ein class-Attribut und CSS legte es an der Spitze des Dokuments. Dinge wie Bilder und links sind auch nicht enthalten in den zurückgegebenen HTML-Code und wahrscheinlich Unmengen mehr Probleme.
Gibt es einen besseren Weg, um HTML aus einem NSAttributedString
? Oder gibt es eine Möglichkeit, ich könnte analysieren, die NSAttributedString
und Schreibe meine eigenen HTML?
- Prüfen Sie das stackoverflow.com/questions/6564258/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann man ansehen konnte, dass repository:
https://github.com/IdeasOnCanvas/Ashton
gibt es 2 interessante Klasse:
Und die Schriftsteller:
Der generierte html-Code ist nicht sehr schön, aber wenn Sie versuchen, zeigen Sie es in einem uiwebview,
es sieht ziemlich gut aus.
Einfache Idee für Bild:
encode es mit base64 kodiert und direkt in ein < img > tag mit dem richtigen frame.
Es ist hässlich, aber es funktioniert => ich habe diesen Prozess zum erstellen und Bearbeiten von html-Datei, die vor einigen Monaten
mn_HTMLRepresentation
das ist eine Kategorie, die Methode auf NSAttributedString und übergeben, ein MFMailComposeViewController als der Körper, und voila, ein schön formatierte E-Mail, die genauso aussieht, wie es in der app textview.Dies ist eine komplexe Frage, und ich beginne mit einer kürzeren Antwort. Sie können mir Fragen in die Kommentare und ich werde zu erweitern auf die Antwort, wie gebraucht.
Wir haben auch versucht zu gehen, der attributierten string Weg, aber fand es nicht geeignet für full-HTML-Bearbeitung. Viele Elemente sind einfach nicht unterstützt, weil entweder der converter ist noch nicht voll entwickelt, oder diese Elemente wurden als außerhalb des Anwendungsbereichs von Apple. Analyse der attributierten string ist nicht gut genug, weil der attributierten string hat schon verloren, die meisten von den Reichtum der HTML durch die Zeit, die Sie versuchen, es neu zu erstellen.
Stattdessen verwenden wir einen webview laden Sie das Dokument in der Regel, und aktivieren
contentEditable
auf das body-element. Was dies bedeutet ist erlauben die Bearbeitung des Dokuments in seinem vollen, begrenzt nur durch WebKit. Am Ende, zum abrufen der HTML zurück, wir deaktivierencontentEditable
und nehmen Sie diedocument.outerHTML
um ein komplettes HTML wie es vorher war, mit änderungen durch die Benutzer.Nicht nehmen, die Entscheidung zur Implementierung dieser Methode leicht. Es ist eine etwas komplexe Lösung, aber sicherlich möglich. Ein webview ist nicht so schön wie eine textview, aber es kann sein, genug massage.
Werde ich erweitern auf diese Antwort Bedarf.
xmlns
namespace, fanden wir, dass, wenn wir schnappen unsinnerHTML
dass es fügt hinzu, dass das Attribut für alle block-Elemente. So waren wir nicht sicher, wie Sie Sie, um zu bekommen, dass seltsames Problem.html
tag oder zu einem bestimmten element?xmlns
- Attribut wird auf diehtml
element. Ohne, dass es ist nicht valides XHTML und die WebView zeigen einen großen Fehler.Hatte ich auch konvertieren NSAtttributedString HTML in einem meiner Projekte. Der code dafür ist wie folgt