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 の 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];
    }
}
于 2009-11-13T19:36:10.583 に答える
3

そのため、まず、イタリック フォントを作成する私の方法に重大な欠陥がありました。テキストに回転を適用するだけでなく、傾斜変換を適用する必要がありました。最終的に、 WebKit の 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 に戻し、必要に応じて上記の変換をそれに適用します。

于 2009-11-12T20:37:27.690 に答える
0

あなたはロック!1つのmodを-14.0回転ではなく-16.0にしたので、ユーザーは巨大なスプレッドシートで斜体の値をより簡単に見つけることができます。私の問題は、LucidaGrande以外のフォントを使用すると、UI全体であらゆる種類の垂直方向の配置の問題が発生することでした。

于 2013-02-12T00:16:00.297 に答える