Введение в ScrollViewReader

На недавней конференции WWDC 2020 Apple представила ScrollViewReader. Это одна из функций, которую многие из нас с нетерпением ждали из-за отсутствия поддержки прокрутки в SwiftUI 1.

Как известно многим из нас, в SwiftUI 1 не было встроенной поддержки для прокрутки к определенной строке. Вероятно, есть несколько разных хакерских способов сделать это с помощью кучи кода, написанного разными людьми в Stack Overflow, но это не так. Не будет ли лучше, если это можно будет сделать с помощью всего лишь строчки кода?

С ScrollViewReader теперь вы можете прокручивать до любой строки с помощью индекса.

Примечание. То же самое не работает для List. Переход к элементу в List не поддерживается на момент публикации.

«ScrollViewReader: представление, дочерний элемент которого определяется как функция ScrollViewProxy, нацеленный на прокручиваемые представления в дочернем элементе».

- документация Apple

Предпосылки

Чтобы следовать этому руководству, вам потребуются базовые знания в:

  • Базовое знакомство со Swift
  • По крайней мере, Xcode 12+
  • Поддерживает только iOS 14+

Начало работы с ScrollViewReader

Для начала вам нужно встроить ScrollViewReader в ScrollView.

Здесь вы будете использовать изображения из SF Symbols - первая версия была впервые представлена ​​в WWDC 2019, а последующая версия - в WWDC 2020. Это отличный инструмент от Apple, где вы можете найти множество полезных значков, но в основном он поддерживает только iOS 13. +. Чтобы он поддерживал iOS 13+, есть обходной путь (экспорт).

В любом случае, давайте не будем отвлекаться на символы SF и сосредоточимся на ScrollViewReader. Идея состоит в том, чтобы иметь кнопку поверх ScrollView с примерно 50 изображениями.

ScrollView {
    ScrollViewReader { value in
        // 1
        Button("Jump to 30") {
            value.scrollTo(30, anchor: .top)
        }
        // 2
        ForEach(1..<51) { index in
            Image(systemName: "\(index).square")
                .font(.largeTitle)
                .frame(height: 70)
                .id(index)
        }
    }
}
  1. Это кнопка, которая появится в списке. Нажав на нее, вы будете перенаправлены в строку.
  2. Изображения создаются с использованием forEach с числами.

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

Нажав на кнопку, вы перейдете к индексу 30.

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

value.scrollTo(30, anchor: .top)

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

.нуль

.центр

ведущий

.trailing

.Нижний

.topLeading

Вы даже можете попробовать topTrailing, но идею вы поняли.

.bottomTrailing

Вы даже можете попробовать .bottomLeading, но вы поняли идею.

Заключение

Спасибо за прочтение.