Domanda

Purtroppo, Lucida Grande non ha una variante italica e ho bisogno di uno.

Le mie opzioni qui sembrano limitati e spero che qualcuno ha uno migliore per me.

Per prima cosa, ho provato, l'applicazione di un NSAffineTransform effettuando le seguenti operazioni:

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

, ma, ciò non produce testo che è particolarmente leggibile.

La mia prossima opzione è quella di passare ad un tipo di carattere diverso:

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

e mentre il testo qui è leggibile quando corsivo, avrei preferito utilizzare lo stesso tipo di carattere dal momento che è ovviamente diverso.

ho potuto, ovviamente, utilizzare font di userFontOfSize sia per il mio corsivo e il testo non in corsivo, ma attualmente sto limitato a utilizzando il carattere systemFontOfSize.

Devo altri (buono) opzioni?

Grazie.

È stato utile?

Soluzione

Questa risposta sarà simile alla mia quella iniziale, ma aggiornato per quello che, dopo ulteriori test, funziona.

Quindi, in primo luogo, il mio metodo di creazione del carattere corsivo è profondamente sbagliata. Invece di semplicemente applicando una rotazione al testo, avevo bisogno di applicare un disallineamento trasformare. Ho finito per trovare un buon skew trasformazione da applicare a WebKit di codice Font. Conteneva l'inclinazione trasformare:

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

Si ha un bell'aspetto.

Semplicemente usando un carattere diverso non è la risposta corretta. Mentre il carattere Lucida Sans è praticamente identico a Lucida Grande (che viene restituito da systemFontOfSize) ed ha una vera variante corsivo, la variante in corsivo non disegnare caratteri giapponesi in corsivo.

Quindi, quello che sembra essere l'unica risposta è quella di ottenere lo systemFontOfSize, controllare per vedere se ha una variante corsivo, e, in caso contrario, aggiungere una skew trasformare.

Ecco la mia soluzione 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];
    }
}

Altri suggerimenti

Quindi, in primo luogo, il mio metodo di creazione del carattere corsivo è profondamente sbagliata. Invece di semplicemente applicando una rotazione al testo, avevo bisogno di applicare un disallineamento trasformare. Ho finito per trovare un buon skew trasformazione da applicare a WebKit di codice Font. Conteneva l'inclinazione trasformare:

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

Si ha un bell'aspetto. Il codice di cacao per impostare questa funzione è:

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

Tuttavia, mi è stato detto da un'altra persona che il tipo di carattere "Lucida Sans" è praticamente identico a Lucida Grande e ha una vera e propria variante in corsivo.

Quindi, in sostanza, sto usando un tipo di carattere diverso, ma uno che dovrebbe incontrarsi con piena approvazione. Tuttavia, se per qualche motivo il carattere Lucida Sans non può essere trovato, io difetto di nuovo a systemFontOfSize e applicare quanto sopra trasformazione per se necessario.

È rock! Ho fatto un -16,0 mod invece di -14.0 rotazione ... in modo utente può trovare i valori in corsivo più facilmente in un foglio di calcolo gigante. Il mio problema era che l'utilizzo di un font non LucidaGrande fa sì che tutti i tipi di problemi di allineamento verticale per tutta la mia UI.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top