2

不幸的是,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 字体。

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

谢谢你。

4

3 回答 3

6

这个答案将与我最初的答案相似,但经过更多测试后,更新了它的工作原理。

因此,首先,我创建斜体字体的方法存在严重缺陷。我需要应用倾斜变换,而不是简单地对文本应用旋转。我最终找到了一个可以在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];
    }
}
于 2009-11-13T19:36:10.583 回答
3

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

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 并在必要时对其应用上述转换。

于 2009-11-12T20:37:27.690 回答
0

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

于 2013-02-12T00:16:00.297 回答