【问题标题】:How do I get Lucida Grande italic into my application?如何将 Lucida Grande 斜体添加到我的应用程序中?
【发布时间】:2010-12-16 00:41:48
【问题描述】:

很遗憾,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 字体。

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

谢谢。

【问题讨论】:

  • 不幸的是,“需要”——除非我能说服 TPTB。缺乏一个好的选择可能会做到这一点。在这一点上,我提出的任何选项都不能完全接受。
  • 这是我的一个小毛病,但你制作的不是斜体字体,而是倾斜字体(又名斜体)。尤其是对于排版师而言,存在巨大差异。

标签: cocoa fonts italic system-font


【解决方案1】:

首先,我创建斜体字体的方法存在严重缺陷。我需要应用倾斜变换,而不是简单地对文本应用旋转。我最终找到了一个很好的倾斜变换,可以在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】:

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

    首先,我创建斜体字体的方法存在严重缺陷。我需要应用倾斜变换,而不是简单地对文本应用旋转。我最终找到了一个很好的倾斜变换,可以在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];
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-25
        • 1970-01-01
        • 1970-01-01
        • 2017-09-12
        • 2019-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多