سؤال

لسوء الحظ، لا تملك Lucida Grande متغير مائل وأحتاج إلى واحدة.

خياراتي هنا تبدو محدودة وأنا آمل أن يكون لدى شخص ما أفضل بالنسبة لي.

أولا، حاولت، وتطبيق NSAffinTransform من خلال القيام بما يلي:

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 font لكل من نص مائل وغير مائل، لكنني أقتصر حاليا استخدام خط SystemFontOfSize.

هل لدي أي خيارات أخرى (جيدة)؟

شكرا لك.

هل كانت مفيدة؟

المحلول

ستكون هذه الإجابة مشابهة لأحد الأولي، لكنها تم تحديثها لما يعمل عليه، بعد المزيد من الاختبار، يعمل.

لذلك، أولا، كانت الطريقة الخاصة بي لخلق الخط المائل معيبة بعمق. بدلا من مجرد تطبيق دوران للنص، كنت بحاجة إلى تطبيق تحويل Skew. انتهى بي الأمر في العثور على تحويل جانبي جيد للتقدم رمز الخط WebKit. وبعد احتوى على تحويل الانحراف:

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

انها تبدو جيدة.

ببساطة استخدام خط مختلف ليس الجواب الصحيح. في حين أن خط Lucida Sans مطابق فعليا ل Lucida Grande (الذي يتم إرجاعه بواسطة SystemFontOnfSize) وله متغير مائل حقيقي، فإن البديل المائل لن يرسم الشخصيات اليابانية في مائل.

لذلك، ما يبدو أن الإجابة الوحيدة هو الحصول على SystemFontOfSize، والتحقق لمعرفة ما إذا كان لديه متغير مائل، وإذا لم يكن كذلك، أضف تحويل Skew.

هنا هو الحل الأخير:

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

نصائح أخرى

لذلك، أولا، كانت الطريقة الخاصة بي لخلق الخط المائل معيبة بعمق. بدلا من مجرد تطبيق دوران للنص، كنت بحاجة إلى تطبيق تحويل Skew. انتهى بي الأمر في العثور على تحويل جانبي جيد للتقدم رمز الخط 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، فسأعود إلى SystemFontOnFize وتطبيق التحويل أعلاه إذا لزم الأمر.

انت صخرة! قمت بإجراء وزارة الدفاع -16.0 واحدة بدلا من -14.0 دوران ... لذلك يمكن للمستخدم العثور على قيم مائلة بسهولة أكبر في جدول بيانات عملاق. كانت مشكلتي هي أن استخدام خط غير Lucidagrande يؤدي إلى جميع أنواع مشكلات المحاذاة الرأسية عبر واجهة المستخدم الخاصة بي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top