Question

Malheureusement, Lucida Grande n'a pas une variante italique et je besoin.

Mes options semblent limitées ici et j'espère que quelqu'un a une meilleure pour moi.

Tout d'abord, j'ai essayé, l'application d'un NSAffineTransform en procédant comme suit:

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];

mais, cela ne produit pas le texte qui est particulièrement lisible.

Mon option suivante est de passer à une autre police:

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

et alors que le texte est lisible ici quand italiques, je préfère utiliser la même police, car il est évidemment différent.

Je pourrais, bien sûr, utiliser la police userFontOfSize pour mon texte en italique et non italique, mais je suis actuellement limitée à l'utilisation de la police systemFontOfSize.

Dois-je tout autre (bon) options?

Merci.

Était-ce utile?

La solution

Cette réponse sera semblable à mon initial, mais mis à jour pour ce qui, après plus de tests, fonctionne.

Alors, d'abord, ma méthode de création de la police en italique était profondément erronée. Au lieu d'appliquer simplement une rotation au texte, je avais besoin d'appliquer une transformation de biais. J'ai fini par trouver une bonne skew transformation à appliquer à WebKit de Code de police . Il contenait le biais transform:

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

Il semble bon.

en utilisant simplement une autre police n'est pas la bonne réponse. Alors que la police Sans Lucida est pratiquement identique à Lucida Grande (qui est retourné par systemFontOfSize) et a une vraie variante italique, la variante italique ne dessinera pas les caractères japonais en italique.

Alors, ce qui semble être la seule réponse est d'obtenir le systemFontOfSize, vérifiez si elle a une variante italique et, sinon, ajouter une transformation de biais.

Voici ma solution finale:

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];
    }
}

Autres conseils

Alors, d'abord, ma méthode de création de la police en italique était profondément erronée. Au lieu d'appliquer simplement une rotation au texte, je avais besoin d'appliquer une transformation de biais. J'ai fini par trouver une bonne skew transformation à appliquer à WebKit de Code de police . Il contenait le biais transform:

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

Il semble bon. Le code de cacao pour le mettre en place est:

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];

Cependant, on m'a dit par une autre personne que la police « Lucida Sans » est pratiquement identique à Lucida Grande et a une vraie variante italique.

Alors, au fond, je me sers d'une autre police, mais qui devrait rencontrer la pleine approbation. Toutefois, si pour une raison quelconque la police Sans Lucida ne peut être trouvé, je par défaut sur systemFontOfSize et appliquer la transformation ci-dessus pour si nécessaire.

You rock! J'ai fait un mod -16,0 au lieu de rotation -14,0 ... si l'utilisateur peut trouver des valeurs plus facilement dans italiques une feuille de calcul géant. Mon problème était que l'utilisation d'une police non LucidaGrande provoque toutes sortes de problèmes d'alignement vertical tout au long de mon interface utilisateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top