Frage

Leider Lucida Grande keine Kursivvariante haben und ich brauche ein.

Meine hier Optionen scheinen begrenzt, und ich hoffe, dass jemand ein besseres für mich hat.

Zuerst habe ich versucht, ein NSAffineTransform Anwendung durch folgende Maßnahmen:

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

, aber dies führt nicht Text, der besonders lesbar ist.

Meine nächste Option ist die Umstellung auf eine andere Schriftart:

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

und während des Text hier lesbar ist, wenn kursive, würde ich lieber die gleiche Schriftart verwendet werden, da es offensichtlich anders ist.

Ich könnte natürlich die Verwendung userFontOfSize Schriftart sowohl für meine kursiv und nicht-kursiven Text, aber ich bin derzeit beschränkt auf die Verwendung der systemFontOfSize Schriftart.

Habe ich irgendwelche andere (gut) Optionen?

Danke.

War es hilfreich?

Lösung

Diese Antwort wird auf meinen anfänglichen ähnlich sein, aber aktualisiert, was nach mehr Tests funktioniert.

Also, zuerst, meine Methode, um die kursive Schrift zu schaffen, war tief fehlerhaft. Anstatt einfach eine Drehung auf den Text anwenden, brauchte ich eine Skew-Transformation anzuwenden. Ich landete einen guten zu finden Skew-Transformation unter WebKit anzuwenden Font-Code . Es enthielt die Skew-Transformation:

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

Es sieht gut aus.

Sie einfach eine andere Schriftart verwendet, ist nicht die richtige Antwort. Während die Lucida Sans Schrift praktisch identisch mit Lucida Grande ist (die durch systemFontOfSize zurückgegeben wird) und hat eine echte kursive Variante wird die Kursiv Variante japanische Zeichen in Kursiv nicht ziehen.

Also, was scheint die einzige Antwort zu sein, ist die systemFontOfSize zu erhalten, zu überprüfen, um zu sehen, ob es eine kursive Variante hat, und wenn nicht, fügen Sie eine Transformation Skew.

Hier ist meine endgültige Lösung:

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

Andere Tipps

Also, zuerst, meine Methode, um die kursive Schrift zu schaffen, war tief fehlerhaft. Anstatt einfach eine Drehung auf den Text anwenden, brauchte ich eine Skew-Transformation anzuwenden. Ich landete einen guten zu finden Skew-Transformation unter WebKit anzuwenden Font-Code . Es enthielt die Skew-Transformation:

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

Es sieht gut aus. Der Kakao Code, um diesen bis zu setzen:

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

Allerdings war ich von einer anderen Person gesagt, dass die „Lucida Sans“ Schrift Lucida Grande praktisch identisch ist und macht eine echte kursive Variante hat.

Also, im Grunde bin ich eine andere Schriftart verwenden, aber eine, die mit voller Zustimmung finden sollte. wenn aus irgendeinem Grund kann jedoch die Lucida Sans Schriftart nicht gefunden werden, ich werde systemFontOfSize Standard zurück und gelten die oben, um es transformieren, wenn nötig.

Sie schaukeln! Ich habe eine mod -16,0 -14,0 statt Rotation ... so Benutzer kursive Werte leichter in einer riesigen Tabelle finden. Mein Problem war, dass ein nicht-LucidaGrande Schrift mit bewirkt, dass alle Arten von vertikalen Ausrichtungsproblemen während meiner UI.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top