ios7 nsattributedstring dynamic-text text-styling

ios7 - Manejando UIContentSizeCategoryDidChangeNotification para NSAttributedString en UITextView



dynamic-text text-styling (1)

Tengo un NSAttributedString en un UITextView y me gustaría manejar el UIContentSizeCategoryDidChangeNotification cuando trabajo con el tipo dinámico y específicamente los estilos de texto. Todos los ejemplos que he visto (IntroToTextKitDemo) abordan el caso en que la fuente es la misma para todo el elemento de la IU. ¿Alguien sabe cómo manejar esto correctamente para que todos los atributos se actualicen correctamente?

Nota: pregunté esto en los foros de desarrolladores cuando iOS 7 estaba bajo NDA. Lo publico aquí porque encontré una solución y pensé que otros podrían encontrarla útil.


Encontré una solución. Al manejar la notificación, debe recorrer los atributos y buscar los estilos de texto y actualizar la fuente:

- (void)preferredContentSizeChanged:(NSNotification *)aNotification { UITextView *textView = <the text view holding your attributed text> NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:textView.attributedText]; NSRange range = NSMakeRange(0, attributedString.length - 1); // Walk the string''s attributes [attributedString enumerateAttributesInRange:range options:NSAttributedStringEnumerationReverse usingBlock: ^(NSDictionary *attributes, NSRange range, BOOL *stop) { // Find the font descriptor which is based on the old font size change NSMutableDictionary *mutableAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; UIFont *font = mutableAttributes[@"NSFont"]; UIFontDescriptor *fontDescriptor = font.fontDescriptor; // Get the text style and get a new font descriptor based on the style and update font size id styleAttribute = [fontDescriptor objectForKey:UIFontDescriptorTextStyleAttribute]; UIFontDescriptor *newFontDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:styleAttribute]; // Get the new font from the new font descriptor and update the font attribute over the range UIFont *newFont = [UIFont fontWithDescriptor:newFontDescriptor size:0.0]; [attributedString addAttribute:NSFontAttributeName value:newFont range:range]; }]; textView.attributedText = attributedString; }