2009-11-12 21 views
2

不幸的是,Lucida Grande沒有斜體變體,我需要一個。如何將Lucida Grande italic加入我的應用程序?

我在這裏的選項似乎有限,我希望有人對我有更好的選擇。

首先,我想,通過執行以下操作應用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字體。

我還有其他(好的)選擇嗎?

謝謝。

+0

不幸的是,「需求」 - 除非我能說服否則TPTB。缺乏一個好的選擇可能會做到這一點。在這一點上,我所提出的任何選項都完全可以接受。 – ericg 2009-11-12 19:20:25

+1

這是我的寵物,但你所做的不是一個斜體字體,而是一個傾斜的字體(a.k.a.斜體)。對於一個印刷工人來說,這是一個巨大的差異。 – dreamlax 2013-02-12 00:20:38

回答

6

這個答案與我最初的答案類似,但經過更多的測試後,更新了它的工作原理。

因此,首先,我創建斜體字體的方法有很大的缺陷。我不需要簡單地將旋轉應用於文本,而是需要應用偏斜變換。我最終找到了一個很好的扭曲變換來申請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

因此,首先,我創建斜體字體的方法存在嚴重缺陷。我不需要簡單地將旋轉應用於文本,而是需要應用偏斜變換。我最終找到了一個很好的扭曲變換來申請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字體,我將默認回到systemFontOfSize並在必要時應用上述轉換。

0

你搖滾!我做了一個mod -16.0而不是-14.0的旋轉...所以用戶可以在一個巨大的電子表格中更容易地找到斜體值。 我的問題是,使用非LucidaGrande字體會在我的用戶界面中導致各種垂直對齊問題。

相關問題