如何将Lucida Grande斜体添加到我的应用程序中? [英] How do I get Lucida Grande italic into my application?

查看:134
本文介绍了如何将Lucida Grande斜体添加到我的应用程序中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我有其他(好的)选项吗?



谢谢。



这个答案将类似于我最初的答案,但更新后的内容,经过更多的测试, p>所以,首先,我的创建斜体字体的方法是有缺陷的。而不是简单地应用旋转到文本,我需要应用偏斜变换。我最终找到了一个很好的偏差变换,可以在 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];
}
}


Unfortunately, Lucida Grande does not have an italic variant and I need one.

My options here seem limited and I am hoping someone has a better one for me.

First, I tried, applying a NSAffineTransform by doing the following:

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];

but, this does not produce text that is particularly readable.

My next option is to switch to a different font:

theFont = [NSFont userFontOfSize:[NSFont labelFontSize]];
theFont = [sharedFontManager convertFont:theFont toHaveTrait:NSItalicFontMask];

and while the text here is readable when italicized, I would rather be using the same font since it is obviously different.

I could, of course, use userFontOfSize font for both my italic and non-italic text, but I am currently limited to using the systemFontOfSize font.

Do I have any other (good) options?

Thank you.

解决方案

This answer will be similar to my initial one, but updated for what, after more testing, works.

So, first, my method of creating the italic font was deeply flawed. Instead of simply applying a rotation to the text, I needed to apply a skew transform. I ended up finding a good skew transform to apply at WebKit's Font code. It contained the skew transform:

CGAffineTransformMake(1, 0, -tanf(SYNTHETIC_OBLIQUE_ANGLE * acosf(0) / 90), 1, 0, 0)

It does look good.

Simply using a different font is not the correct answer. While the Lucida Sans font is virtually identical to Lucida Grande (which is returned by systemFontOfSize) and has a real italic variant, the italic variant will not draw Japanese Characters in italic.

So, what appears to be the only answer is to obtain the systemFontOfSize, check to see if it has an italic variant, and, if not, add a skew transform.

Here is my final solution:

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];
    }
}

这篇关于如何将Lucida Grande斜体添加到我的应用程序中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆