xamarin ios monospaced Numbers с использованием UIFontFeature - кто-нибудь знает, почему это не работает

Я думал, что теперь в приложениях 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 ответ

Во-первых, ваш код не делает моноширинный шрифт.

Вы настраиваете шрифт для отображения цифр в моноширинном режиме. Таким образом, все ваши цифры будут иметь одинаковую ширину.

Ниже приведен пример с 4 метками, 1 - Docis Light, 2 - Docis Light с вашей настройкой, 3 - системный шрифт того же размера, 4 - системный шрифт с вашей настройкой:

моноширинный шрифт в ios

Как видите, Docis Light уже поддерживает моноширинную функцию цифр из коробки без каких-либо настроек.

Если вам нужно использовать моноширинный шрифт, вы должны использовать собственный моноширинный шрифт (предназначенный для моноширинного шрифта) или вы можете использовать встроенные моноширинные шрифты iOS, такие как Courier или Menlo (см. Все доступные шрифты iOS на http://iosfonts.com/)

Вот как они выглядят при одном сценарии:

моноширинные шрифты iOS для Courier и Menlo

С настройками или без них, они уже моноширинные, а их цифры также моноширинные.

Наконец, если вам нужен моноширинный шрифт цифр (что делает ваш код), вам не нужно настраивать символьную альтернативу. Таким образом, код будет:

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.

Другие вопросы по тегам