Как получить курсив Lucida Grande в моем приложении? - PullRequest
2 голосов
/ 12 ноября 2009

К сожалению, у Lucida Grande нет курсива, и мне нужен один.

Мои возможности здесь ограничены, и я надеюсь, что кто-то найдет для меня лучший вариант.

Сначала я попытался применить NSAffineTransform, выполнив следующее:

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

но это не дает текста, который особенно удобочитаем.

Мой следующий вариант - переключиться на другой шрифт:

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

и хотя текст, выделенный курсивом, можно прочитать, я бы предпочел использовать один и тот же шрифт, поскольку он, очевидно, отличается.

Конечно, я мог бы использовать шрифт userFontOfSize для своего курсивного и не курсивного текста, но в настоящее время я ограничен использованием шрифта systemFontOfSize.

Есть ли у меня другие (хорошие) варианты?

Спасибо.

Ответы [ 3 ]

6 голосов
/ 13 ноября 2009

Этот ответ будет похож на мой первоначальный, но обновлен для того, что, после дополнительного тестирования, работает.

Итак, во-первых, мой метод создания курсивного шрифта был глубоко испорчен. Вместо того, чтобы просто применять вращение к тексту, мне нужно было применить наклонное преобразование. В итоге я нашел хорошее перекосное преобразование для кода шрифта WebKit . Содержит косое преобразование:

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

Это выглядит хорошо.

Просто использование другого шрифта не является правильным ответом. Хотя шрифт Lucida Sans практически идентичен шрифту Lucida Grande (который возвращается systemFontOfSize) и имеет реальный вариант курсива, вариант курсива не будет отображать японские символы курсивом.

Итак, единственный ответ - получить systemFontOfSize, проверить, есть ли у него курсив, и, если нет, добавить перекос.

Вот мое окончательное решение:

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];
    }
}
3 голосов
/ 12 ноября 2009

Итак, во-первых, мой метод создания курсивного шрифта был глубоко испорчен. Вместо того, чтобы просто применять вращение к тексту, мне нужно было применить наклонное преобразование. В итоге я нашел хорошее перекосное преобразование для кода шрифта WebKit . Содержит косое преобразование:

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

Это выглядит хорошо. Код какао, чтобы установить это:

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

Однако другой человек сказал мне, что шрифт "Lucida Sans" практически идентичен шрифту Lucida Grande и имеет настоящий курсивный вариант.

Итак, в основном я использую другой шрифт, но тот, который должен получить полное одобрение. Однако, если по какой-либо причине шрифт Lucida Sans не может быть найден, я по умолчанию вернусь к systemFontOfSize и при необходимости применю к нему приведенное выше преобразование.

0 голосов
/ 12 февраля 2013

Ты рок! Я сделал один мод -16.0 вместо -14.0 вращения ... чтобы пользователь мог легче находить выделенные курсивом значения в гигантской электронной таблице. Моя проблема заключалась в том, что использование шрифта не-LucidaGrande вызывает все виды проблем с вертикальным выравниванием во всем моем пользовательском интерфейсе.

...