Динамический Mocking iOS Динамический тип Размер текста системы (UIContentSizeCategory)

Я хотел бы легко проверить свое приложение с различными вариантами размера системного текста, включая размеры доступности. Их можно установить в приложении «Настройки» («Экран & Яркость => Размер текста» или «Общий»> «Доступность»> «Большой текст»).

Единственный способ, который я могу найти в настоящее время, – перейти в Настройки и изменить значение с помощью пользовательского интерфейса (отредактировать: частичное решение, описанное ниже). Это медленный и громоздкий. Я подозреваю, что есть способ динамически изменить его, используя частные API, но я не могу понять, как это сделать. Поскольку моя цель состоит в том, чтобы использовать это только для отладки, использование частного API и swizzling – это нормально (этот код не будет работать).

Чтобы попытаться найти частный API для этого, я рассмотрел некоторые обратные инженерные ресурсы. Я новичок в дизассемблерах, таблицах символов, дампах классов и поиске частных API, которые я могу использовать, но это то, что я пробовал до сих пор:

  • Я успешно swizzled -[UIApplication preferredContentSizeCategory] (другие сообщения сказали, что это сработало в прошлом), но это не влияет на результат, возвращаемый с +[UIFont preferredFontForTextStyle:] .

  • Используя дизассемблер IDA, я обнаружил, что +[UIFont preferredFontForTextStyle:] находится в частной структуре UIFoundation.framework . ( -[UIApplication preferredContentSizeCategory] находится в UIKit.framework но UIKit.framework не выглядел бесполезным).

  • Так же, как я начал писать этот вопрос (так всегда бывает), я обнаружил частичное решение . Можно задать параметр запуска в схеме, чтобы установить значение при запуске. Это полезно, но не то, что мне нужно.

  • В приведенном выше ответе я нашел, что значение для предпочтения пользователя, по-видимому, хранится в «файле com.apple.UIKit.plist расположенном в каталоге data/Library/Preferences Simulator data/Library/Preferences ». Значение, которое мы получаем, можно установить из утилиты командной строки plutil . Это тоже улучшение! Но я бы хотел динамически изменить его во время выполнения.

Больше о моих результатах от МАР:

Я действительно не знаю, как читать разборку, но +[UIFont preferredFontForTextStyle:] похоже указывает на символ ___UIFontForTextStyle который, похоже, указывает на некоторые интересные звуковые символы, называемые _getUIContentSizeCategoryUnspecified и _getUIContentSizeCategoryPreferenceClass

Разборка для <code> ___ UIFontForTextStyle </ code>

Я также нашел эти символы, используя утилиту командной строки nm на UIFoundation.framework . Они были отмечены строчной буквой «s», означающей, по-видимому, «Символ находится в неинициализированной секции данных для небольших объектов». , Я понятия не имею, что это значит (все, что я собрал, это то, что они не класс или метод).

Поиск в Интернете для символов _getUIContentSizeCategory... ничего не дает, но рядом есть еще один символ _getUIApplicationClass . Я искал это, так как это звучало немного более общее, и нашел что-то подобное в некоторых источниках WebKit . Не может быть ничего, но, возможно, это внутреннее соглашение Apple. Несмотря на это, этот пример не помогает мне решить проблему.

В любом случае спасибо за чтение. Если вы все еще здесь, мой вопрос:

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

Установка этого значения в качестве аргумента запуска является приятной, но не полностью решает мою проблему. Аналогично, изменение значения Simulator в plist также хорошо для автоматизации, но не решает мою проблему.

Есть ли способ динамически изменить это значение во время выполнения?

One Solution collect form web for “Динамический Mocking iOS Динамический тип Размер текста системы (UIContentSizeCategory)”

Как неловко! Я смотрел какую-то устаревшую документацию iOS 9.x и пропустил, что UITraitCollection получил init(preferredContentSizeCategory: UIContentSizeCategory) и var preferredContentSizeCategory: UIContentSizeCategory в iOS 10, который мне был var preferredContentSizeCategory: UIContentSizeCategory Брендону Уильямсу . Это касается моих потребностей.

  • Системный шрифт для iOS 8 и iOS 9
  • Отображение пропорционально разнесенных номеров (вместо моноширинного / табличного) на iOS
  • Шрифт UITextView равен нулю
  • Интервал между буквами в iOS
  • Как установить имя шрифта UILabel как HelveticaNeue Thin в iOS?
  • UITextView - некоторые шрифты вызывают исчезновение текста
  • iOS CoreText получает список зарегистрированных шрифтов через CTFontManagerRegisterGraphicsFont
  • Изменение размера UILabel на основе содержимого
  • iOS - получить «реальную» высоту буквы
  • Масштабирование размера UIFont относительно размера экрана
  • Как я могу воссоздать этот шрифт iOS с тенью?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.