xamarin ios monospaced使用UIFontFeature的数字 - 有谁知道为什么这不起作用

时间:2016-10-12 14:06:20

标签: fonts xamarin.ios monospace

我认为现在可以在IOS应用程序中强制使用自定义字体时数字是等宽的。我找到了一些示例,并使用了一些编译的代码,但我的数字间距仍然是成比例的。有没有人有这个工作,如果是这样,我做错了什么?!

这是我的代码:

UIFont bigNumberFont = UIFont.FromName("Dosis-Light", 60f);

var originalDescriptor = bigNumberFont.FontDescriptor;
var attributes = new UIFontAttributes(new UIFontFeature(CTFontFeatureNumberSpacing.Selector.MonospacedNumbers),
            new UIFontFeature((CTFontFeatureCharacterAlternatives.Selector)0));

var newDesc = originalDescriptor.CreateWithAttributes(attributes);

UIFont bigNumberMono = UIFont.FromDescriptor(newDesc, 60f);

lbCurrentPaceMinute.Font = bigNumberMono;

我的自定义字体渲染得很好,但我还无法控制数字间距。任何建议都非常感谢!

1 个答案:

答案 0 :(得分:1)

首先,您的代码不是使字体等宽。

您正在调整字体以在等宽模式下呈现数字。所以你的所有数字都有相同的宽度。

以下是4个标签的示例,1个是Docis Light,第2个是带有调整的Docis Light,第3个是相同大小的系统字体,第4个是带有调整的系统字体:

monospaced digits font tweak in ios

如您所见,Docis Light已经开始支持等宽数字功能,无需调整。

如果您需要使用等宽字体,则必须使用自定义等宽字体(设计为等宽字体),或者您可以使用内置的iOS等宽字体(如Courier或Menlo)(请参阅{{3}处的所有可用iOS字体})

这是他们在相同情况下的样子:

http://iosfonts.com/

无论有没有调整,它们都已经是等宽的,它们的数字也是等宽的。

最后,如果你需要使用等宽数字字体(你的代码所做的),你不需要调整字符替代。所以代码是:

public static class UIFontExtensions
{
    public static UIFont MonospacedDigitFont(this UIFont font)
    {
        var originalDescriptor = font.FontDescriptor;
        var monospacedNumbersFeature = new UIFontFeature(CTFontFeatureNumberSpacing.Selector.MonospacedNumbers);
        var attributes = new UIFontAttributes(monospacedNumbersFeature);
        var newDescriptor = originalDescriptor.CreateWithAttributes(attributes);
        return UIFont.FromDescriptor(newDescriptor, font.PointSize);
    }
}

希望这有帮助!我发现有趣的是深入了解如何在iOS中调整字体。