para - tamaño de letra en tabla html
El tamaño de la fuente ios7 cambia cuando se crea nsattributedstring desde html (5)
También me enfrenté a este problema, lo arreglé iterando a los atributos y restableciendo el tamaño de la fuente anterior de la siguiente manera
NSMutableAttributedString *res = [attributedText mutableCopy];
[res beginEditing];
[res enumerateAttribute:NSFontAttributeName
inRange:NSMakeRange(0, res.length)
options:0
usingBlock:^(id value, NSRange range, BOOL *stop) {
if (value) {
UIFont *oldFont = (UIFont *)value;
UIFont *newFont = [oldFont fontWithSize:15];
[res addAttribute:NSFontAttributeName value:newFont range:range];
}
}];
[res endEditing];
[self.textFileInputView setAttributedText:res];
Tengo un UITextView donde estoy administrando un NSAttributedString, inicialmente ingresado como normal a través del teclado. Guardo la cadena atribuida como HTML, que se ve bien. Cuando lo vuelvo a cargar y lo vuelvo a convertir en una cadena atribuida del HTML, el tamaño de la fuente parece cambiar.
Por ejemplo, el HTML al cargarse se ve así:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<title></title>
<meta name="Generator" content="Cocoa HTML Writer">
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 21.0px Helvetica; color: #000000; -webkit-text- stroke: #000000}
span.s1 {font-family: ''Helvetica''; font-weight: normal; font-style: normal; font-size: 21.00pt; font-kerning: none}
</style>
</head>
<body>
<p class="p1"><span class="s1">There is some text as usual lots of text</span></p>
</body>
</html>
Lo convierto y verifico los atributos con el siguiente código:
// convert to attributed string
NSError *err;
NSAttributedString *as = [[NSAttributedString alloc] initWithData:data3
options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)}
documentAttributes:nil
error:&err] ;
NSMutableAttributedString *res = [as mutableCopy];
[res enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, res.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) {
if (value) {
UIFont *oldFont = (UIFont *)value;
NSLog(@"On Loading: Font size %f, in range from %d length %d", oldFont.pointSize, range.location, range.length);
}
}];
El resultado muestra que el tamaño de fuente ha aumentado de 21 a 28:
On Loading: Font size 28.000000, in range from 0 length 40
On Loading: Font size 21.000000, in range from 40 length 1
Básicamente, cada vez que cargo la cadena, el tamaño de la fuente aumenta. Necesito almacenarlo como HTML en lugar de como NSData porque también lo usarán otras plataformas.
¿Alguien tiene alguna idea de por qué está sucediendo esto?
Se corrigió este comportamiento mágico de Apple con el siguiente código:
static CGFloat const kListsLeading = 10.0;
static CGFloat const kListsAdditionalShift = 4.0;
//
// Fix Apple magic 4/3 koefficient
// http://.com/questions/20992950/ios7-font-size-change-when-create-nsattributedstring-from-html
//
static NSAttributedString *DecreaseFontSizeBecauseOfAppleMagic(NSAttributedString *astr) {
NSMutableAttributedString *mastr = [astr mutableCopy];
[mastr enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, astr.length) options:0 usingBlock:^(UIFont *_Nullable value, NSRange range, BOOL *_Nonnull stop) {
if (value) {
UIFont *font = [value fontWithSize:value.pointSize * 0.75];
[mastr addAttribute:NSFontAttributeName value:font range:range];
}
}];
[mastr enumerateAttribute:NSParagraphStyleAttributeName inRange:NSMakeRange(0, astr.length) options:0 usingBlock:^(NSParagraphStyle *_Nullable value, NSRange range, BOOL *_Nonnull stop) {
if (value) {
NSMutableParagraphStyle *style = [value mutableCopy];
style.minimumLineHeight *= 0.75;
if (style.firstLineHeadIndent == style.headIndent) {
style.firstLineHeadIndent *= 0.75;
style.headIndent *= 0.75;
}
else if (style.firstLineHeadIndent < kListsLeading) {
CGFloat shift = (kListsLeading - style.firstLineHeadIndent);
style.headIndent += shift + kListsAdditionalShift;
style.firstLineHeadIndent = kListsLeading;
NSMutableArray *tabs = [NSMutableArray array];
NSInteger index = 0;
for (NSTextTab *tab in style.tabStops) {
[tabs addObject:[[NSTextTab alloc] initWithTextAlignment:tab.alignment location:tab.location + shift + kListsAdditionalShift * (index ? 1 : 0) options:tab.options]];
index++;
}
style.tabStops = tabs;
}
style.tailIndent *= 0.75;
[mastr addAttribute:NSParagraphStyleAttributeName value:style range:range];
}
}];
return [mastr copy];
}
Usar <span>
y css funciona para mí, después de analizar HTML en NSAttributedText: ¿cómo configurar la fuente? :
// HTML -> NSAttributedString
+ (NSAttributedString *)attributedStringFromHTML:(NSString *)html {
NSError *error;
NSDictionary *options = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};
NSAttributedString *attrString = [[NSAttributedString alloc] initWithData:[html dataUsingEncoding:NSUTF8StringEncoding] options:options documentAttributes:nil error:&error];
if(!attrString) {
NSLog(@"creating attributed string from HTML failed: %@", error.debugDescription);
}
return attrString;
}
// force font thrugh <span> & css
+ (NSAttributedString *)attributedStringFromHTML:(NSString *)html withFont:(UIFont *)font {
return [Util attributedStringFromHTML:[NSString stringWithFormat:@"<span style=/"font-family: %@; font-size: %f/";>%@</span>", font.fontName, font.pointSize, html]];
}
Esto establece el nombre y el tamaño de la fuente, pero no afecta los estilos.
Versión de Swift 3.0
Con una relación de 0.75
yourAttrStr.beginEditing()
yourAttrStr.enumerateAttribute(NSFontAttributeName, 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.addAttribute(NSFontAttributeName, value: resizedFont, range: range)
}
}
yourAttrStr.endEditing()//yourAttrStrwill be the same size as html string
Esto no es enteramente una respuesta, más una alternativa y un comentario sobre las otras respuestas dadas, así que disculpas.
Las respuestas dadas a @KishoreThindaak y @Danomatika están bien si sabes cuáles deberían ser los tamaños de fuente, pero mi aplicación tiene un Mac OS twin que puede generar texto de cualquier tamaño, y por lo tanto tenía que ser general.
La respuesta dada por @ k06a funciona para texto simple, pero descubrí que no funcionaba con estilos incrustados, particularmente con varios estilos en una línea que estaba incrustada en una etiqueta <li>
.
Después de muchas horas de tratar de solucionar esto, me temo que abandoné HTML por completo como el formato de disco y adopté RTF en su lugar, que funciona bien, y proporciona un archivo RTF que se puede leer en todas las plataformas. Código simple para obtener RTF abajo ...
extension NSAttributedString {
func rtf(encoding: String.Encoding) -> Data? {
let options: [NSAttributedString.DocumentAttributeKey : Any] = [
NSAttributedString.DocumentAttributeKey.documentType: NSAttributedString.DocumentType.rtf,
NSAttributedString.DocumentAttributeKey.characterEncoding: encoding.rawValue
]
return try? self.data(from: NSMakeRange(0, self.length), documentAttributes: options)
}
class func from(rtfData data: Data, encoding: String.Encoding) -> NSAttributedString? {
let options: [NSAttributedString.DocumentReadingOptionKey : Any] = [
NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.rtf,
NSAttributedString.DocumentReadingOptionKey.characterEncoding: encoding.rawValue
]
return try? NSMutableAttributedString(data: data, options: options, documentAttributes: nil)
}
}