В предыдущем руководстве мы представили новую функцию ScrollView в iOS 17, которая позволяет разработчикам легко определять положение прокрутки и реализовывать функцию прокрутки вверх (или прокрутки вниз). В дополнение к этой функциональности в последней версии SwiftUI также представлен новый модификатор под названием scrollTransition
, который позволяет нам наблюдать за сменой представлений и применять различные анимированные эффекты.
Примечание. Чтобы следовать этому руководству, убедитесь, что вы используете Xcode 15 (или выше).
Ранее мы создали базовое представление прокрутки. Давайте продолжим использовать его в качестве примера. Для справки, вот код для создания прокрутки:
ScrollView { LazyVStack(spacing: 10) { ForEach(0...50, id: \.self) { index in bgColors[index % 5] .frame(height: 100) .overlay { Text("\(index)") .foregroundStyle(.white) .font(.system(.title, weight: .bold)) } .onTapGesture { withAnimation { scrollID = 0 } } } } .scrollTargetLayout() } .contentMargins(50.0, for: .scrollContent) .scrollPosition(id: $scrollID)
Использование модификатора ScrollTransition
Переход в представлениях прокрутки описывает изменения, которые должно претерпевать дочернее представление при его появлении или исчезновении. Новый модификатор scrollTransition
позволяет нам отслеживать эти переходы и соответствующим образом применять различные визуальные и анимационные эффекты.
Чтобы продемонстрировать, как это работает, давайте изменим код из предыдущего раздела, добавив модификатор scrollTransition
в представление прокрутки. Вот обновленный код:
ScrollView { . . . } .scrollTransition { content, phase in content .opacity(phase.isIdentity ? 1.0 : 0.3) .scaleEffect(phase.isIdentity ? 1.0 : 0.3) }
Мы применяем тонкую анимацию, изменяя непрозрачность и размер дочерних представлений. Замыкание scrollTransition
передает два параметра: дочернее представление и фазу перехода. Существует три возможных значения фаз перехода: .identity
, .topLeading
и .bottomTrailing
. В зависимости от фазы мы можем применять различные визуальные эффекты.