Этот ответ будет похож на мой первоначальный, но обновлен для того, что, после дополнительного тестирования, работает.
Итак, во-первых, мой метод создания курсивного шрифта был глубоко испорчен. Вместо того, чтобы просто применять вращение к тексту, мне нужно было применить наклонное преобразование. В итоге я нашел хорошее перекосное преобразование для кода шрифта 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];
}
}