Потяните вниз, чтобы обновить данные в SwiftUI - Xcode 12-iOS 14

В этом руководстве мы собираемся реализовать Pull для обновления, используя только компоненты SwiftUI.

Мы собираемся разделить эту проблему на две части:

  1. Логика для определения того, открывает ли пользователь прокрутку
  2. Добавить просмотр хода выполнения и развернуть анимацию загрузчика

Логика для определения того, раскрывает ли пользователь просмотр прокрутки. Мы собираемся использовать пространство координатора ScrollView с представлением Child GeometryReader. Это поможет нам оценить, потянул ли пользователь представление и сколько пользователь потянул представление. Если пользователь сильно потянул прокрутку (в нашем случае 50 пикселей). Мы будем считать, что пользователь хочет принудительно перезагрузить просмотр.

Добавить представление прогресса и развернуть анимацию загрузчика. Если вызывается обновление, мы хотим показать только ProgressView (). Но если пользователь потянет вниз, нам нужно показать статический индикатор выполнения, который станет видимым при прокрутке вниз. для этого нам нужно имитировать индикатор выполнения, используя VStack и RotationEffect.

ForEach(0..<8) { tick in
 VStack {
   Rectangle()
   .fill(Color(UIColor.tertiaryLabel))
   .opacity(
       (Int((geo.frame(in: coordinateSpace).midY)/7) < tick) 
         ? 0 : 1) //show bar based on how much view been pulled down
   .frame(width: 3, height: 7)
   .cornerRadius(3)
   Spacer()
 }.rotationEffect(Angle.degrees(Double(tick)/(8) * 360))
}.frame(width: 20, height: 20, alignment: .center)

Кроме того, нам нужно переместить наше представление RefreshControl в раздел «Навигация», чтобы добавить смещение. Итак, окончательный код выглядит следующим образом: