Убедитесь, что стили шрифтов не попадают в кодовую базу вашего приложения.

Примечание. Для получения справочной информации и основ о том, как категории размера содержимого работают с текстом в iOS, ознакомьтесь с этой статьей.

API-интерфейсы iOS отлично помогают масштабировать текст, обеспечивая лучшую доступность для пользователей. Использование UIFont.TextStyle и UITraitCollection может помочь вам создать гибкий и масштабируемый интерфейс. Но что, если вы хотите использовать пользовательские шрифты вместо шрифтов по умолчанию, сохраняя при этом такую ​​гибкость?

Магию, связывающую шрифт и стиль текста вместе, можно найти в UIFontMetrics. Учитывая шрифт, он может больше рассказать нам о размере пункта, который должен иметь шрифт для определенного стиля текста. Это поможет нам правильно масштабировать наш настраиваемый шрифт в зависимости от роли, которую он выполняет в макете:

Это практически все, что нужно для использования собственных шрифтов при правильном масштабировании. Просто убедитесь, что используете подходящий стиль текста.

Конечно, есть еще кое-что, чтобы сделать это правильно. Во-первых, вы, вероятно, не захотите так разбрасывать конфигурацию шрифтов в своем приложении.
Кроме того, одна из специальных возможностей iOS - выделение шрифтов полужирным шрифтом для лучшей читаемости. Если вы используете системные шрифты, вам не нужно ничего делать, чтобы это работало. К сожалению, даже если используемое вами семейство пользовательских шрифтов содержит версию, выделенную жирным шрифтом, эта информация не будет использоваться автоматически.

Сбор ваших шрифтовых стилей

Хорошая идея - собрать используемые стили шрифтов в одном месте, чтобы поддерживать чистоту кодовой базы и упростить изменение стилей в будущем.
Для этого давайте упростим преобразование нашего шрифта в тот, который соответствует к желаемому стилю тестирования:

Это позволяет нам взять собственный шрифт и убедиться, что он правильно масштабируется. basePointSize - это размер шрифта, который должен иметь, когда для preferredContentSizeCategory установлено значение .medium. Есть несколько удобных констант. При желании вы можете установить maxPointSize, чтобы ограничить масштабирование в тех местах, где наш интерфейс еще не совсем готов.

Затем мы определим список стилей шрифтов, которые будут использоваться в приложении, который может выглядеть примерно так:

Если мы хотим использовать этот шрифт, мы можем просто вызвать любой из них, в зависимости от наших конкретных пожеланий:

Исправить настройки системы полужирного текста

Пока вы используете UIFont.preferredFont(forTextStyle: <style>) или что-то вроде UIFont.systemFont(ofSize: 15), система большую часть времени будет правильно выделять шрифт жирным шрифтом - большую часть времени, потому что кажется, что поведение по умолчанию также не совсем правильное. Многократное включение и отключение функции полужирного текста может вызвать довольно странное поведение:

В зависимости от стиля текста метка может вести себя не так, как ожидалось. Кажется, что при изменении свойства Полужирный текст вес шрифта увеличивается, но не уменьшается.

Мы можем исправить обе проблемы сразу. Это не очень хорошо, но, создав подкласс класса UILabel, мы можем отслеживать исходный шрифт и отслеживать изменения в настроенном legibilityWeight:

Теперь, после программной установки шрифта, конфигурация переключения работает как для шрифтов по умолчанию, так и для пользовательских шрифтов, как и ожидалось:

Бонусный совет

Если вы хотите программно поиграть с характеристиками настроек, вы можете переопределить их для childViewController:

let trait = UITraitCollection(legibilityWeight: .bold)
setOverrideTraitCollection(trait, forChild: childVC)

Обратите внимание, что это не работает ни для текущего UIViewController, ни для UIView экземпляров. Вы можете установить его только для детей.

Вот и все. Всем спасибо за чтение и удачного кодирования!