cocoa - 如何将 Lucida Grande italic 添加到我的申请中?

标签 cocoa fonts italic system-font

不幸的是,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 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];
    }
}

关于cocoa - 如何将 Lucida Grande italic 添加到我的申请中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1724647/

相关文章:

css - 如何使用ttf文件中的图标

java - 组件中的多语言

r - 如何将radarchart ("fmsb"包中的默认标签字体类型更改为斜体)?

objective-c - 将Sparkle Framework添加到项目时错误: linker command failed with exit code 1 (use -v to see invocation)

iphone - 如何使用 URL 从 xcode 以 Debug模式启动应用程序

cocoa - 将 NSTextField 转换为 NSImage?

html - 谷歌字体显示=交换奇怪的行为

r - 如何以斜体打印小写希腊三角洲 [ggplot 轴标题]

fonts - 如何使 iText 中的文本同时显示为粗体和斜体?

macos - 对安全主机 URL 执行 Ping