Pregunta

Por desgracia, Lucida Grande no tiene una variante cursiva y necesito uno.

Mis opciones aquí parecen limitados y estoy esperando que alguien tiene uno mejor para mí.

En primer lugar, he intentado, la aplicación de un NSAffineTransform haciendo lo siguiente:

NSFont *theFont = [NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSMiniControlSize]];

const CGFloat kRotationForItalicText = -15.0;

NSAffineTransform *italicTransform = [NSAffineTransform transform];

[italicTransform scaleBy:[NSFont systemFontSizeForControlSize:NSMiniControlSize]];
[italicTransform rotateByDegrees:kRotationForItalicText];

theFont = [NSFont fontWithDescriptor:[theFont fontDescriptor] textTransform:italicTransform];

Sin embargo, esto no produce un texto que es particularmente fácil de leer.

Mi siguiente opción es cambiar a una fuente diferente:

theFont = [NSFont userFontOfSize:[NSFont labelFontSize]];
theFont = [sharedFontManager convertFont:theFont toHaveTrait:NSItalicFontMask];

y mientras que el texto se puede leer aquí cuando en cursiva, prefiero estar usando el mismo tipo de letra, ya que es obviamente diferente.

Podría, por supuesto, utilizar la fuente userFontOfSize tanto para mi texto en cursiva y no en cursiva, pero actualmente estoy limitado a la utilización de la fuente systemFontOfSize.

¿Tengo otras opciones (bueno)?

Gracias.

¿Fue útil?

Solución

Esta respuesta será similar a mi uno inicial, pero actualizado para lo que, después de más pruebas, funciona.

Por lo tanto, en primer lugar, mi método de crear el tipo de letra cursiva era profundamente defectuoso. En lugar de la simple aplicación de una rotación en el texto, que necesitaba para aplicar una transformada de inclinación. Acabé encontrar una buena posición oblicua de transformación para aplicárselo en de WebKit código fuente. Contenía la inclinación transformar:

CGAffineTransformMake(1, 0, -tanf(SYNTHETIC_OBLIQUE_ANGLE * acosf(0) / 90), 1, 0, 0)

se ve bien.

El simple uso de una fuente diferente no es la respuesta correcta. Mientras que la fuente Lucida Sans es prácticamente idéntica a Lucida Grande (que es devuelto por systemFontOfSize) y tiene una verdadera variante cursiva, la variante cursiva no dibujar caracteres japoneses en cursiva.

Por lo tanto, lo que parece ser la única respuesta es obtener la systemFontOfSize, comprobar para ver si tiene una variante cursiva, y, si no, añadir una transformada de inclinación.

Aquí está mi solución final:

NSFont              *theFont            = [NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSMiniControlSize]];
NSFontManager       *sharedFontManager  = [NSFontManager sharedFontManager];

if ( wantItalic ) 
{
    theFont = [sharedFontManager convertFont:theFont toHaveTrait:NSItalicFontMask];

    NSFontTraitMask fontTraits = [sharedFontManager traitsOfFont:theFont];

    if ( !( (fontTraits & NSItalicFontMask) == NSItalicFontMask ) ) 
    {
        const CGFloat kRotationForItalicText = -14.0;

        NSAffineTransform *fontTransform = [NSAffineTransform transform];           

        [fontTransform scaleBy:[NSFont systemFontSizeForControlSize:NSMiniControlSize]];

        NSAffineTransformStruct italicTransformData;

        italicTransformData.m11 = 1;
        italicTransformData.m12 = 0;
        italicTransformData.m21 = -tanf( kRotationForItalicText * acosf(0) / 90 );
        italicTransformData.m22 = 1;
        italicTransformData.tX  = 0;
        italicTransformData.tY  = 0;

        NSAffineTransform   *italicTransform = [NSAffineTransform transform];

        [italicTransform setTransformStruct:italicTransformData];

        [fontTransform appendTransform:italicTransform];

        theFont = [NSFont fontWithDescriptor:[theFont fontDescriptor] textTransform:fontTransform];
    }
}

Otros consejos

Por lo tanto, en primer lugar, mi método de crear el tipo de letra cursiva era profundamente defectuoso. En lugar de la simple aplicación de una rotación en el texto, que necesitaba para aplicar una transformada de inclinación. Acabé encontrar una buena posición oblicua de transformación para aplicárselo en de WebKit código fuente. Contenía la inclinación transformar:

CGAffineTransformMake(1, 0, -tanf(SYNTHETIC_OBLIQUE_ANGLE * acosf(0) / 90), 1, 0, 0)

se ve bien. El código de cacao para configurar esto es:

const CGFloat kRotationForItalicText = -14.0;

NSAffineTransform *fontTransform = [NSAffineTransform transform];           

[fontTransform scaleBy:[NSFont systemFontSizeForControlSize:NSMiniControlSize]];

NSAffineTransformStruct italicTransformData;

italicTransformData.m11 = 1;
italicTransformData.m12 = 0;
italicTransformData.m21 = -tanf( kRotationForItalicText * acosf(0) / 90 );
italicTransformData.m22 = 1;
italicTransformData.tX  = 0;
italicTransformData.tY  = 0;

NSAffineTransform   *italicTransform = [NSAffineTransform transform];

[italicTransform setTransformStruct:italicTransformData];

Sin embargo, me dijeron por otra persona que la fuente "Lucida Sans" es prácticamente idéntica a Lucida Grande y tiene una verdadera variante cursiva.

Así que, básicamente, estoy usando una fuente diferente, pero que debe contar con la aprobación completa. Sin embargo, si por alguna razón no se puede encontrar el tipo de letra Lucida Sans, que volverá por defecto a systemFontOfSize y aplicar lo anterior se transforman a ella si es necesario.

You rock! Hice un -16,0 -14,0 mod en lugar de la rotación ... de modo usuario puede encontrar los valores en cursiva más fácilmente en una hoja de cálculo gigante. Mi problema era que el uso de una fuente no LucidaGrande provoca todo tipo de problemas de alineación vertical durante mi interfaz de usuario.

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