Pergunta

Infelizmente, Lucida Grande não tem uma variante itálico e eu preciso de um.

As minhas opções aqui parecem limitados e eu estou esperando que alguém tem um melhor para mim.

Em primeiro lugar, eu tentei, aplicando uma NSAffineTransform fazendo o seguinte:

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

Mas, isso não produz texto que é particularmente legível.

A minha próxima opção é mudar para uma fonte diferente:

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

e enquanto o texto aqui é legível quando itálico, eu preferiria estar usando a mesma fonte, uma vez que é obviamente diferente.

Eu poderia, é claro, fonte uso userFontOfSize tanto para o meu texto em itálico e não itálico, mas estou actualmente limitado a usar a fonte systemFontOfSize.

Eu tenho quaisquer outras (boas) opções?

Obrigado.

Foi útil?

Solução

Esta resposta será semelhante ao meu único inicial, mas atualizado para o que, depois de mais testes, funciona.

Assim, em primeiro lugar, o meu método de criar a fonte em itálico foi profundamente falho. Em vez de simplesmente aplicar uma rotação para o texto, eu precisava para aplicar transformar uma inclinação. Acabei encontrando um bom distorcer transformar para aplicar em WebKit do código fonte. Continha a inclinação de transformação:

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

Ele parece bom.

Simplesmente usando uma fonte diferente não é a resposta correta. Enquanto a fonte Lucida Sans é virtualmente idêntico ao Lucida Grande (que é devolvido por systemFontOfSize) e tem uma verdadeira variante itálico, a variante itálico não vai chamar caracteres japoneses em itálico.

Então, o que parece ser a única resposta é obter a systemFontOfSize, verificar para ver se ele tem uma variante itálico, e, se não, adicione um enviesamento transformar.

Aqui está a minha solução 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];
    }
}

Outras dicas

Assim, em primeiro lugar, o meu método de criar a fonte em itálico foi profundamente falho. Em vez de simplesmente aplicar uma rotação para o texto, eu precisava para aplicar transformar uma inclinação. Acabei encontrando um bom distorcer transformar para aplicar em WebKit do código fonte. Continha a inclinação de transformação:

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

Ele parece bom. O código de cacau para configurar isso é:

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

No entanto, foi-me dito por outra pessoa que os "Lucida Sans" fonte é praticamente idêntico ao Lucida Grande e tem uma verdadeira variante itálico.

Então, basicamente, eu estou usando uma fonte diferente, mas que deve reunir-se com total aprovação. No entanto, se por algum motivo a fonte Lucida Sans não pode ser encontrado, eu voltarão ao padrão no systemFontOfSize e aplicar o acima transformar a ela se necessário.

Você rock! Eu fiz um mod -16,0 vez de -14,0 rotação ... assim que o usuário pode encontrar valores em itálico mais facilmente em uma planilha gigante. Meu problema era que o uso de uma fonte não-LucidaGrande faz com que todos os tipos de problemas de alinhamento vertical ao longo da minha interface do usuário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top