В SwiftUI компонент ScrollView по умолчанию двигается плавно, но с использованием модификаторов scrollTargetLayout()
и scrollTargetBehavior()
мы можем сделать так, чтобы он автоматически "привязывался" к определенным дочерним представлениям или целым страницам.
Поместим в качестве примера 10 скругленных прямоугольников в горизонтальный ScrollView, каждый из которых будет целевым при скроллинге. Поскольку .scrollTargetBehavior()
установлен как .viewAligned
, SwiftUI автоматически будет "привязываться" к каждому из скругленных прямоугольников:
struct ContentView: View {
var body: some View {
ScrollView(.horizontal) {
LazyHStack {
ForEach(0..<10) { index in
RoundedRectangle(cornerRadius: 25)
.fill(Color(hue: Double(index) / 10, saturation: 1, brightness: 1).gradient)
.frame(width: 300, height: 100)
}
}
.scrollTargetLayout()
}
.scrollTargetBehavior(.viewAligned)
.safeAreaPadding(.horizontal, 40)
}
}
При использовании модификатора scrollTargetLayout()
, все элементы внутри контейнера становятся целями прокрутки, к которым ScrollView может "привязываться". Если необходимо, чтобы прокрутка "привязывалась" только к определенным дочерним представлениям, то вместо scrollTargetLayout()
нужно использовать модификатор scrollTarget()
, который используется для отдельных элементов.
Есть и альтернативный режим привязки прокрутки — .paging
. Этот режим позволяет ScrollView перемещаться ровно на ширину или высоту экрана, в зависимости от направления прокрутки:
ScrollView {
ForEach(0..<50) { index in
Text("Item \(index)")
.font(.largeTitle)
.frame(maxWidth: .infinity)
.frame(height: 200)
.background(.blue)
.foregroundStyle(.white)
.clipShape(.rect(cornerRadius: 20))
}
}
.scrollTargetBehavior(.paging)
Здесь создается ScrollView, содержащий 50 элементов типа Text
, каждый из которых заполняет полную ширину экрана. С помощью модификатора .scrollTargetBehavior(.paging)
обеспечивается прокрутка ровно на один экран при каждом движении: