SwiftUI

Как сохранить пользователей при загрузке данных в SwiftUI

Пользовательские заполнители для более приятного ожидания

Ждать скучно.

Никому из нас это не нравится.

Но иногда нам приходится.

В 1993 году в статье под названием Время отклика: 3 важных ограничения всемирно известного справочника по пользовательскому опыту Nielsen Group говорилось следующее:

1 секунда - это предел для непрерывного потока мыслей пользователя, даже если пользователь заметит задержку.

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

Это остается в силе и в 2020 году: время отклика при ожидании события звучит как большое дело.

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

Но даже при применении этих улучшений иногда не будет другого сценария, кроме ожидания. И в этом случае интерфейс должен соответственно отреагировать.

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

Загрузка данных способом iOS

Об этой теме в Руководстве Apple по человеческому интерфейсу говорится об этой проблеме с упором на экран запуска:

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

Как люди, мы быстрее воспринимаем время, когда нас развлекают, и процесс кажется динамичным и близким к завершению.

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

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

Проблема, которую нужно решить

Перед более подробным объяснением загрузки, заполнителей и прочего, давайте установим некоторые основы. Это приложение, созданное на SwiftUI, будет отображать сводный контент статьи, полученный с сервера, создавая такой простой макет.

Структура статьи следующая:

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

Редакции

SwiftUI представил в SwiftUI 2.0 встроенную функцию, которая называется редактирование. Она доступна с iOS 14 и автоматически генерирует заполнители на основе содержимого.

Заполнители предоставляются SwiftUI с использованием двух модификаторов представления:

  • .redacted(reason: .placeholder): если он добавлен к элементу, он будет отредактирован с помощью заполнителя. Причина может быть разной, и именно здесь мы можем создать несколько интересных пользовательских заполнителей.
  • .unredacted: если он добавлен к элементу, он не будет отредактирован, даже если отредактировано его родительское представление. Это можно использовать, чтобы намеренно избежать редактирования или указать, что элемент больше не нужно редактировать (т.е., когда данные уже загружены)

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

Переход от заполнителя к содержанию

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

Чтобы построить элемент .redacted или .unredacted, вы создадите @ViewBuilder. Возвращаемое представление будет зависеть от определенного параметра условия. В нашем случае свойство с именем isLoading будет определять характер представления в зависимости от состояния загрузки.

Чтобы получить более плавный переход между отредактированным и неотредактированным состояниями, к представлению будет применен модификатор .animation.

Настройка заполнителей - Типы редактирования

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

Используя бесконечную циклическую анимацию, будут созданы настраиваемые отредактированные типы заполнителей:

Пользовательский заполнитель

Заполнитель появляется и исчезает при изменении модификатора .opacity.

Заполнитель эффекта масштабирования

Заполнитель масштабируется, становясь больше и / или меньше при изменении модификатора .scaleEffect.

Заполнитель эффекта размытия

Заполнитель становится размытым с использованием модификатора просмотра blur(radius:).

В соответствии с этими типами у вас есть следующие RedactionType случаи перечисления:

Поскольку эти заполнители являются представлениями, вы создадите @ViewBuilder с именем Redactable, который на основе RedactionType вернет один из настраиваемых заполнителей, определенных выше.

Все эти три настраиваемых заполнителя имеют некоторые общие черты:

  • Каждый настраиваемый заполнитель представляет собой составное представление над элементом .redacted.
  • Состояние выполнения переключается, как только заполнитель появляется на экране, что побуждает его перейти от предыдущего значения к новому с помощью бесконечной анимации.
  • Поскольку содержимое не изменяется, а только маскируется, доступ к нему можно получить через VoiceOver. По этой причине требуется метка доступности.

После создания конструктора заполнителей давайте воспользуемся расширением View, которое выдает .modifier с выбранным заполнителем. Это расширение будет вызываться в необходимых элементах.

Последний шаг для выбора любого из вариантов создания заполнителей:

Заключение

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

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

SwiftUI уже предоставляет отличное встроенное решение, но настроить это решение легко, и оно станет еще лучше!