HTML vers NSAtsortingbutedSsortingng et NSAtsortingbutedSsortingng vers HTML

J'ai un problème avec NSAtsortingbutedSsortingng …

Je veux convertir une string HTML en un NSAtsortingbutedSsortingng et ensuite travailler sur le NSAtsortingbutedSsortingng (changer des colors, fontsize, fontfamily, arrière-plan, couleur de premier plan) , puis convertir le text HTML brut à partir du NSAtsortingbutedSsortingng.

La conversion n'est pas un problème , mais à chaque fois que je convertis HTML en NSAS et que la taille de la police devient de plus en plus grande !

Voici une image et le code source de mon terrain de jeu.

// Playground - noun: a place where people can play // NSAS: - NSAtsortingbutedSsortingng import UIKit class Wrapper { //MARK: fields let apiHtml = "<div style='font-size: 18px'><span style='font-family:'andale mono', times;'>Dies</span> <span style='font-family:'comic sans ms', sans-serif;'>ist</span> <strong><span style='font-family:'andale mono', sans-serif;';>eine</span></strong> <em>formatierte</em> <span style='text-decoration:underline;'>Karte</span> <span style='font-size:16px;'>die</span> <span style='background-color:#ffff00;'>es</span> zu Übernehmen gilt</div>" var newGeneratedHtml = "" var textView : UITextView! //MARK: constructor init() { //init textview textView = UITextView(frame: CGRectMake(0, 0, 500, 300)) //convert html into NSAS and set it to textview if let atsortingbutedText = getAtsortingbutedTextFromApiHtmlSsortingng(apiHtml) { textView.atsortingbutedText = atsortingbutedText } //get html text from textfields NSAS if let htmlText = getHtmlTextFromTextView() { newGeneratedHtml = htmlText println(htmlText) } //set the converted html from textfields NSAS if let atsortingbutedText = getAtsortingbutedTextFromApiHtmlSsortingng(newGeneratedHtml) { textView.atsortingbutedText = atsortingbutedText } //get html text from textfields NSAS if let htmlText = getHtmlTextFromTextView() { newGeneratedHtml = htmlText println(htmlText) } } //MARK: methods func getAtsortingbutedTextFromApiHtmlSsortingng(text : Ssortingng) -> NSAtsortingbutedSsortingng? { if let atsortingbutedText = NSAtsortingbutedSsortingng(data: text.dataUsingEncoding(NSUTF8SsortingngEncoding, allowLossyConversion: true)!, options: [NSDocumentTypeDocumentAtsortingbute : NSHTMLTextDocumentType], documentAtsortingbutes: nil, error: nil) { return atsortingbutedText } return nil } func getHtmlTextFromTextView() -> Ssortingng? { let atsortingbutedTextFromTextView = textView.atsortingbutedText if let htmlData = atsortingbutedTextFromTextView.dataFromRange(NSMakeRange(0, atsortingbutedTextFromTextView.length), documentAtsortingbutes: [NSDocumentTypeDocumentAtsortingbute : NSHTMLTextDocumentType], error: nil) { if let htmlSsortingng = NSSsortingng(data: htmlData, encoding: NSUTF8SsortingngEncoding) { return htmlSsortingng } } return nil } } var w = Wrapper() 

Voici le résultat du terrain de jeu, vous pouvez voir que le deuxième text est plus grand que le premier, mais je n'ai pas changé la taille de la police.

Est-ce un bug ou devais-je définir une taille de police fixe?

Mais définir une taille de police fixe n'est pas ce que je veux vraiment, car il peut être différent pour chaque char …

Voici le résultat du terrain de jeu, vous pouvez voir que le deuxième texte est plus grand que le premier, mais je n'ai pas changé la taille de la police.

METTRE À JOUR:

J'accepte @ Franco réponse parce qu'il a raison. Je ne sais pas pourquoi il est converti en px en pt mais voici ma solution de contournement:

 func getAtsortingbutedTextFromApiHtmlSsortingng(text : Ssortingng) -> NSAtsortingbutedSsortingng? { if let atsortingbutedText = NSAtsortingbutedSsortingng(data: text.dataUsingEncoding(NSUTF8SsortingngEncoding, allowLossyConversion: false)!, options: [NSDocumentTypeDocumentAtsortingbute : NSHTMLTextDocumentType], documentAtsortingbutes: nil, error: nil) { var res : NSMutableAtsortingbutedSsortingng = atsortingbutedText.mutableCopy() as NSMutableAtsortingbutedSsortingng res.beginEditing() var found : Bool = false; res.enumerateAtsortingbute(NSFontAtsortingbuteName, inRange:NSMakeRange(0, res.length) ,options:NSAtsortingbutedSsortingngEnumerationOptions.allZeros, usingBlock: {(value:AnyObject!, range:NSRange, stop:UnsafeMutablePointer<ObjCBool>) -> Void in if ((value) != nil) { let oldFont = value as UIFont; let newFont = oldFont.fontWithSize(15) res.removeAtsortingbute(NSFontAtsortingbuteName, range:range) res.addAtsortingbute(NSFontAtsortingbuteName, value: newFont, range: range) found = true } }) if !found { // No font was found - do something else? } res.endEditing() return res } return nil } 

Le seul inconvénient de ceci est que vous perdez différentes hauteurs de text dans votre AtsortingbutedSsortingng ….

Maintenant, je dois find un moyen de garder les différentes hauteurs de text … Si quelqu'un a la solution ou un meilleur travail, n'hésitez pas à postr votre réponse.

C'est probablement des erreurs d'arrondi dans l'aller-return. Essayez d'utiliser des tailles de points entières (avec pt au lieu de px )

Ok, en regardant la sortie de votre console, il traduit votre px en pt , alors peut-être que vous pouvez le pirater en prenant le HTML qui vient de la conversion et en changeant pt en px .

J'ai résolu cela en appliquant un ratio de 0,75 sur chaque taille de fond dans votre string. Dites si vous avez plusieurs fonts dans votre string atsortingbuée, lorsque vous faites une boucle sur chacune d'entre elles, appliquez simplement le ratio et ensuite vous êtes tous set. Voici mon code dans swift 3.0:

 yourAttrStr.beginEditing() yourAttrStr.enumerateAtsortingbute(NSFontAtsortingbuteName, in: NSMakeRange(0, yourAttrStr.length), options: .init(rawValue: 0)) { (value, range, stop) in if let font = value as? UIFont { let resizedFont = font.withSize(font.pointSize * 0.75) yourAttrStr.addAtsortingbute(NSFontAtsortingbuteName, value: resizedFont, range: range) } } yourAttrStr.endEditing()//yourAttrStr will be the same size as html ssortingng 

Ceci est le morceau de code qui est en cours d'exécution dans ma request

 extension Ssortingng { func htmlAtsortingbutedSsortingng() -> NSAtsortingbutedSsortingng? { guard let data = self.data(using: Ssortingng.Encoding.utf16, allowLossyConversion: false) else { return nil } guard let html = try? NSMutableAtsortingbutedSsortingng( data: data, options: [NSDocumentTypeDocumentAtsortingbute: NSHTMLTextDocumentType], documentAtsortingbutes: nil) else { return nil } html.beginEditing() html.enumerateAtsortingbute(NSFontAtsortingbuteName, in: NSMakeRange(0, html.length), options: .init(rawValue: 0)) { (value, range, stop) in if let font = value as? UIFont { let resizedFont = font.withSize(font.pointSize * 0.75) html.addAtsortingbute(NSFontAtsortingbuteName, value: resizedFont, range: range) } } html.endEditing() return html } } 

Pour l'utiliser:

 let htmlStr: Ssortingng = "<font size=\"6\">font a</font><font size=\"16\">Font b</font>" let atsortingStr: NSAtsortingbutedSsortingng? = htmlStr.htmlAtsortingbutedSsortingng()