Как мне добавить курсив Lucida Grande в мое приложение?
-
19-09-2019 - |
Вопрос
К сожалению, в 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.
Есть ли у меня какие-либо другие (хорошие) варианты?
Спасибо.
Решение
Этот ответ будет похож на мой первоначальный, но обновлен для того, что после дополнительного тестирования сработает.
Итак, во-первых, мой метод создания курсивного шрифта был глубоко ошибочным.Вместо того чтобы просто применять поворот к тексту, мне нужно было применить косое преобразование.В итоге я нашел хорошее косое преобразование для применения в Код шрифта WebKit's.Он содержал косое преобразование:
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];
}
}
Другие советы
Итак, во-первых, мой метод создания курсивного шрифта был глубоко ошибочным.Вместо того чтобы просто применять поворот к тексту, мне нужно было применить косое преобразование.В итоге я нашел хорошее косое преобразование для применения в Код шрифта WebKit's.Он содержал косое преобразование:
CGAffineTransformMake(1, 0, -tanf(SYNTHETIC_OBLIQUE_ANGLE * acosf(0) / 90), 1, 0, 0)
Это действительно выглядит хорошо.Код cocoa для настройки этого является:
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 и при необходимости применю к нему вышеупомянутое преобразование.
Ты крут!Я сделал один мод с вращением -16.0 вместо -14.0...таким образом, пользователю будет легче находить выделенные курсивом значения в гигантской электронной таблице.Моя проблема заключалась в том, что использование шрифта, отличного от LucidaGrande, вызывает всевозможные проблемы с выравниванием по вертикали во всем моем пользовательском интерфейсе.