- Создать представление карусели, поддерживающее непрерывное прокрутка и пейджинг
- Он должен быть совместим с iOS 15 и 16, поэтому я не могу использовать ScrollTargetBehavior(_:) и ScrollTargetLayout(isEnabled:)
Верхняя карусель показывает поведение привязки и пейджинга, а нижняя карусель показывает непрерывную прокрутку.
Это код, который у меня есть на данный момент, который дает мне непрерывную прокрутку для всех версий, но только поведение привязки для iOS 17+
Код: Выделить всё
import SwiftUI
struct CarouselView: View {
let content: Content
@State private var currentIndex = 0
private var showsIndicators: Bool
private var spacing: CGFloat
private var offset: CGFloat
private var shouldSnap: Bool
init(showsIndicators: Bool = true,
spacing: CGFloat = 0,
offset: CGFloat = 0,
shouldSnap: Bool = false,
@ViewBuilder content: @escaping () -> Content) {
self.content = content()
self.showsIndicators = showsIndicators
self.spacing = spacing
self.offset = offset
self.shouldSnap = shouldSnap
}
var body: some View {
ScrollView(.horizontal, showsIndicators: showsIndicators) {
LazyHStack(spacing: spacing) {
content
.offset(x: offset)
}
.apply {
$0.apply {
if #available(iOS 17.0, *), shouldSnap {
$0.scrollTargetLayout()
} else {
$0
}
}
}
}
.apply {
if #available(iOS 17.0, *), shouldSnap {
$0.scrollTargetBehavior(.viewAligned)
} else {
$0
}
}
}
}
extension View {
func apply(@ViewBuilder _ block: (Self) -> V) -> V { block(self) }
}
Я видел некоторые реализации с TabView, и хотя изначально это действительно показал некоторые обещания в том, что он поддерживает привязку/пейджинг, ограничения для меня следующие:
- Он показывает только 1 просмотр за раз, мне нужно иметь возможность чтобы показать следующий элемент
- Я хочу иметь возможность настраивать расстояние между текущим элементом и следующим
Подробнее здесь: https://stackoverflow.com/questions/784 ... -on-scroll