簡體   English   中英

如何在我的應用程序中獲得Lucida Grande斜體?

[英]How do I get Lucida Grande italic into my application?

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

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

謝謝。

這個答案與我最初的答案類似,但經過更多測試后,可以更新。

所以,首先,我創建斜體字體的方法存在嚴重缺陷。 我不需要簡單地對文本應用旋轉,而是需要應用偏斜變換。 我最終找到了一個很好的偏斜變換來應用於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];
    }
}

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM