不幸的是,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字体。
我还有其他(好的)选择吗?
谢谢。
答案 0 :(得分:6)
这个答案与我最初的答案类似,但经过更多测试后,可以更新。
所以,首先,我创建斜体字体的方法存在严重缺陷。我不需要简单地对文本应用旋转,而是需要应用偏斜变换。我最终找到了一个好的偏斜变换以应用于WebKit's Font code。它包含了偏斜变换:
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];
}
}
答案 1 :(得分:3)
所以,首先,我创建斜体字体的方法存在严重缺陷。我不需要简单地对文本应用旋转,而是需要应用偏斜变换。我最终找到了一个好的偏斜变换以应用于WebKit's Font code。它包含了偏斜变换:
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并在必要时将上述转换应用于它。
答案 2 :(得分:0)