Как динамически адаптировать константы и представления

Эта статья основана на моей предыдущей, поэтому, прежде чем двигаться дальше, я рекомендую вам сначала прочитать ее:



Примечание

Я буду использовать SnapKit в своем коде, но этот подход можно применить к другим библиотекам макетов, а также к NSLayoutConstraint и SwiftUI от Apple.

Как адаптировать константы

Чтобы решить эту проблему, мы будем использовать адаптированную функцию (реализация описана в статье выше) и расширение Int.

Вкратце, функция адаптированная позволяет нам динамически адаптировать константу в зависимости от размеров экрана устройства.

Это расширение Int содержит 2 вычисляемых свойства:

  • VAdapted (с вертикальной адаптацией) - это вычисляемое свойство адаптируется к постоянной относительно вертикальной плоскости.
  • HAdapted (Horizontally Adapted) - это вычисляемое свойство адаптирует константу относительно горизонтальной плоскости.

Вот пример использования:

В приведенном выше фрагменте кода мы ограничиваем представление сверху и слева. А поскольку мы предоставили адаптированные константы с использованием вычисленных свойств VAdapted и HAdapted, константы будут различаться на разных экранах. размеры.

Хочу подчеркнуть, что константы будут адаптированы на основе изначально предоставленных относительно базового размера экрана.

Это означает, что если вы выберете iPhone 8 в качестве базового устройства и вызовете 100.VAdapted, будут предприняты следующие шаги:

  1. Соотношение будет вычислено:
    100/667 ≈ 0,15, где
    100 - константа
    667 - базовая высота экрана.
  2. Это соотношение будет использоваться для изменения константы для других размеров экрана. Например, представим, что мы открыли приложение на iPhone 12 Pro Max. Произойдет следующий расчет:
    926 × 0,15 ≈ 140, где
    926 - высота экрана целевого устройства
    0,15 - соотношение полученный на первом этапе
  3. Результат будет возвращен

Вышеупомянутые шаги показывают нам, что начальное соотношение рассчитывается на основе базового устройства и будет сохраняться независимо от размера других устройств.

Как изменить размер окна пропорционально

Чтобы изменить размер представления пропорционально, мы будем использовать функцию resized (вы можете найти реализацию в моей статье выше) и расширение Array.

Короче говоря, функция resized позволяет нам пропорционально изменять размер представления, сохраняя исходное соотношение сторон.

Чтобы максимально упростить использование, я решил создать расширение Array и ограничить доступ к дополнительным функциям только для массивов типа Int.

Расширение содержит 2 вычисляемых свойства:

  • VResized (вертикальное изменение размера) - это вычисляемое свойство изменяет размеры констант относительно вертикальной плоскости.
  • HResized (Horizontally Resized) - это вычисляемое свойство изменяет размеры констант относительно горизонтальной плоскости.

Эти свойства изменяют размеры констант на основе массива Int, где первое значение представляет ширину, а второе значение представляет высоту.

Чтобы предотвратить неправильное использование свойств, существует оператор защиты, который выдает fatalError, если в массиве больше или меньше 2 элементов.

Использование очень просто:

Под капотом будут предприняты следующие шаги:

  1. Соотношение сторон будет вычислено:
    60/250 = 0,24, где
    60 - высота обзора для базового устройства
    250 - ширина обзора для базового устройства.
  2. Новая ширина будет рассчитана первой, так как было выбрано свойство HResized:
    428 × (250/375) ≈ 285, где
    428 - ширина экрана целевого устройства
    250 - ширина просмотра
    375 - ширина основного экрана
  3. Новая высота будет рассчитана на основе новой ширины и соотношения сторон, полученных на первом этапе:
    285 × 0,24 ≈ 68, где
    285 - новая ширина просмотра
    0,24 - соотношение сторон
  4. Будет возвращен результат:
    CGSize (ширина: 285, высота: 68)

Хочу отметить, что существует правило, согласно которому вы должны выбрать либо VResized, либо HResized:

Если ширина больше, чем высота, следует выбрать Размер HR, соответственно, если высота больше ширины, следует выбрать Размер VR. Если ширина и высота равны, вы должны выбрать HResized.

Результат

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

Вывод

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

Исходный код

Исходный код и реальный пример использования можно найти в моем репозитории GitHub: