不幸的是,很好的可读性不具有变体斜体和我需要一个。

在这里,我选择似乎有限,我希望有人有一个更好的我。

首先,我试图,通过执行以下操作施加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)

它看起来不错。

简单地利用不同的字体是不正确的答案。而龙力Sans字体几乎是相同的很好的可读性(其由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];

然而,我被另一人的“龙力三世”字体几乎是相同的很好的可读性和确实有一个真正的斜体变体告知。

所以,基本上,我使用的是不同的字体,而是一个应具有完全同意。然而,如果由于某种原因,龙力Sans字体无法找到,我将默认回systemFontOfSize和必要时采取上述变换到它。

您摇滚!我做了一个MOD -16.0而不是-14.0旋转......所以用户可以在一个巨大的电子表格更容易找到斜体值。 我的问题是,使用非LucidaGrande字体导致各种垂直对齐的问题在我的整个UI。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top