Cocoa 如何让Lucida Grande italic进入我的应用程序?

Cocoa 如何让Lucida Grande italic进入我的应用程序?,cocoa,fonts,italic,system-font,Cocoa,Fonts,Italic,System Font,不幸的是,Lucida Grande没有斜体变体,我需要一个 我在这里的选择似乎有限,我希望有人能给我一个更好的 首先,我尝试通过以下操作应用NSAffinetTransform: NSFont *theFont = [NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSMiniControlSize]]; const CGFloat kRotationForItalicText = -15.0; NSAffineTr

不幸的是,Lucida Grande没有斜体变体,我需要一个

我在这里的选择似乎有限,我希望有人能给我一个更好的

首先,我尝试通过以下操作应用NSAffinetTransform:

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字体

我还有其他(好的)选择吗


谢谢。

因此,首先,我创建斜体字体的方法存在严重缺陷。我需要应用倾斜变换,而不是简单地对文本应用旋转。我最终找到了一个好的倾斜变换来应用。它包含倾斜变换:

CGAffineTransformMake(1, 0, -tanf(SYNTHETIC_OBLIQUE_ANGLE * acosf(0) / 90), 1, 0, 0)
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,并在必要时对其应用上述转换。

此答案与我最初的答案类似,但经过更多测试后会更新


因此,首先,我创建斜体字体的方法存在严重缺陷。我需要应用倾斜变换,而不是简单地对文本应用旋转。我最终找到了一个好的倾斜变换来应用。它包含倾斜变换:

CGAffineTransformMake(1, 0, -tanf(SYNTHETIC_OBLIQUE_ANGLE * acosf(0) / 90), 1, 0, 0)
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];
    }
}

你太棒了!我做了一个mod-16.0而不是-14.0的旋转。。。所以用户可以在一个巨大的电子表格中更容易地找到斜体值。
我的问题是,使用非LucidaGrande字体会在整个UI中导致各种垂直对齐问题。

不幸的是,“需要”-除非我能说服TPTB。缺乏一个好的选择可能会做到这一点。目前,我提出的任何一种选择都不是完全可以接受的。这是我的一个不满,但你所做的不是斜体,而是倾斜字体(又称斜体)。这是一个巨大的差异,尤其是对一个印刷师来说。