Pregunta

Necesito fijar un tamaño de texto (por ejemplo a 42) del texto enriquecido seleccionado que utiliza múltiples fuentes.

Me imagino que puedo comprobar los atributos de cada grupo de caracteres, modificar el tamaño de fuente y establecer los atributos de vuelta, pero observa el panel de fuente flotante parece que no debe haber una manera muy fácil y sencilla para lograr eso. ¿Me perdí algo obvio?

¿Fue útil?

Solución

Esto duplicará el tamaño de fuente, pero puede cambiar la propiedad de escala a cualquier valor o proporcionar su tamaño fijo

    NSFont * font = ...;
    CGFloat fontSize =  [[font fontDescriptor].fontAttributes[NSFontSizeAttribute] floatValue];
    font = [NSFont fontWithDescriptor:[font fontDescriptor] size:fontSize * 2.];

    self.textField.font = font;

Otros consejos

El 10,6 hay una manera conveniente para iterar sobre los atributos y aumentar el tamaño de fuente. Este método se puede añadir a una categoría de NSTextView.

    - (IBAction)increaseFontSize:(id)sender
{
    NSTextStorage *textStorage = [self textStorage];
    [textStorage beginEditing];
    [textStorage enumerateAttributesInRange: NSMakeRange(0, [textStorage length])
                                     options: 0
                                  usingBlock: ^(NSDictionary *attributesDictionary,
                                                NSRange range,
                                                BOOL *stop)
     {
#pragma unused(stop)
         NSFont *font = [attributesDictionary objectForKey:NSFontAttributeName];
         if (font) {
             [textStorage removeAttribute:NSFontAttributeName range:range];
             font = [[NSFontManager sharedFontManager] convertFont:font toSize:[font pointSize] + 1];
             [textStorage addAttribute:NSFontAttributeName value:font range:range];
         }
     }];
    [textStorage endEditing];
    [self didChangeText];

}

La generalización de la respuesta de Jonathan un poco, aquí hay una interfaz de categoría puede simplemente pegar en los archivos apropiados en su proyecto Xcode:

@interface NSTextView (FrameworkAdditions)

-  (IBAction)decrementFontSize:(id)sender;
-  (IBAction)incrementFontSize:(id)sender;

@end

Y la aplicación correspondiente:

@implementation NSTextView (FrameworkAdditions)

- (void)changeFontSize:(CGFloat)delta;
{
    NSFontManager * fontManager = [NSFontManager sharedFontManager];
    NSTextStorage * textStorage = [self textStorage];
    [textStorage beginEditing];
    [textStorage enumerateAttribute:NSFontAttributeName
                            inRange:NSMakeRange(0, [textStorage length])
                            options:0
                         usingBlock:^(id value,
                                      NSRange range,
                                      BOOL * stop)
     {
         NSFont * font = value;
         font = [fontManager convertFont:font
                                  toSize:[font pointSize] + delta];
         if (font != nil) {
             [textStorage removeAttribute:NSFontAttributeName
                                    range:range];
             [textStorage addAttribute:NSFontAttributeName
                                 value:font
                                 range:range];
         }
     }];
    [textStorage endEditing];
    [self didChangeText];
}

-  (IBAction)decrementFontSize:(id)sender;
{
    [self changeFontSize:-1.0];
}

-  (IBAction)incrementFontSize:(id)sender;
{
    [self changeFontSize:1.0];
}

@end

Nota: . Asumo que está utilizando un NSTextView y que puede acceder a su almacenamiento de texto (NSTextStorage)

Creo que no sólo es posible cambiar el tamaño de la fuente sobre un texto que utilizan múltiples fuentes. En NSAttributedString, el tamaño de fuente es parte del atributo NSFontAttributeName que controla tanto la fuente y el tamaño.

Una solución es iterar sobre la selección y el uso de la attribute:atIndex:longestEffectiveRange:inRange: para capturar el rango cuando se aplica cada fuente, cambie el tamaño de la fuente y luego usar el addAttribute:value:range: para establecer el nuevo tipo de letra en todo el rango.

Actualizar

Si se echa un vistazo en el rel="nofollow código fuente GNUStep GUI para NSTextView (menores LGPL), verá que su aplicación utilice la iteración gama.

Desde NSTextView es una subclase de NSView, puede utilizar -scaleUnitSquareToSize: para cambiar el nivel de ampliación de la vista de texto. Por ejemplo, para hacer que todo el texto de tamaño doble que se dice:

[textView scaleUnitSquareToSize:NSMakeSize(2.0, 2.0)];

Es posible que tenga que hacer algunos ajustes a las dimensiones de NSTextContainer de la vista de texto después de realizar esta operación para garantizar el texto dispuesto correctamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top