В 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) обеспечивается прокрутка ровно на один экран при каждом движении:

ссылка на оригинал статьи https://habr.com/ru/articles/745102/
Добавить комментарий