cocoa - ¿Cómo consigo la cursiva de Lucida Grande en mi aplicación?
fonts italic (3)
Entonces, primero, mi método para crear la fuente en cursiva era profundamente defectuoso. En lugar de simplemente aplicar una rotación al texto, necesitaba aplicar una transformación oblicua. Terminé encontrando una buena transformación de inclinación para aplicar al código de fuente de WebKit . Contenía la transformación oblicua:
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, otra persona me dijo que la fuente "Lucida Sans" es prácticamente idéntica a Lucida Grande y tiene una variante cursiva real.
Entonces, básicamente, estoy usando una fuente diferente, pero una que debe cumplir con la aprobación completa. Sin embargo, si por algún motivo no se puede encontrar la fuente Lucida Sans, regresaré a systemFontOfSize y aplicaré la transformación anterior si es necesario.
Desafortunadamente, Lucida Grande no tiene una variante en cursiva y necesito una.
Mis opciones aquí parecen limitadas y espero que alguien tenga una mejor para mí.
Primero, lo intenté, aplicando 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];
pero, esto no produce un texto que sea particularmente legible.
Mi próxima opción es cambiar a una fuente diferente:
theFont = [NSFont userFontOfSize:[NSFont labelFontSize]];
theFont = [sharedFontManager convertFont:theFont toHaveTrait:NSItalicFontMask];
y aunque el texto aquí es legible cuando está en cursiva, prefiero usar la misma fuente, ya que obviamente es diferente.
Podría, por supuesto, usar la fuente userFontOfSize tanto para mi cursiva como para mi cursiva, pero actualmente estoy limitado a usar la fuente systemFontOfSize.
¿Tengo alguna otra (buena) opción?
Gracias.
Esta respuesta será similar a la inicial, pero actualizada para qué, después de más pruebas, funcione.
Entonces, primero, mi método para crear la fuente en cursiva era profundamente defectuoso. En lugar de simplemente aplicar una rotación al texto, necesitaba aplicar una transformación oblicua. Terminé encontrando una buena transformación de inclinación para aplicar al código de fuente de WebKit . Contenía la transformación oblicua:
CGAffineTransformMake(1, 0, -tanf(SYNTHETIC_OBLIQUE_ANGLE * acosf(0) / 90), 1, 0, 0)
Se ve bien.
Simplemente usar una fuente diferente no es la respuesta correcta. Mientras que la fuente Lucida Sans es prácticamente idéntica a Lucida Grande (que es devuelta por systemFontOfSize) y tiene una variante cursiva real, la variante en cursiva no dibujará caracteres japoneses en cursiva.
Entonces, lo que parece ser la única respuesta es obtener el systemFontOfSize, verificar si tiene una variante cursiva y, si no, agregar una transformación sesgada.
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];
}
}
¡Rock! Hice una mod -16.0 en lugar de una rotación de -14.0 ... para que el usuario pueda encontrar los valores en cursiva más fácilmente en una hoja de cálculo gigante. Mi problema es que el uso de una fuente que no sea LucidaGrande causa todo tipo de problemas de alineación vertical en toda mi interfaz de usuario.