Это маршрут поездки, состоящий из двух частей:
- Горизонтально прокручиваемый список дат вверху страницы.
- Вертикально прокручиваемый список дней (каждый день содержит множество остановок).
Аналогично, когда пользователь нажимает на день в горизонтальном списке вверху страницы, я настроил его на автоматическую прокрутку вниз до этого дня в вертикальном списке.
Вот этот код:
Код: Выделить всё
struct TripView: View {
@Environment(\.dismiss) private var dismiss
@Binding var trip: Trip
@State private var activeDate: String?
var body: some View {
VStack(spacing: 0) {
// HORIZONTAL DATE PICKER
ScrollViewReader { proxy in
ScrollView(.horizontal, showsIndicators: false) {
LazyHStack(spacing: 16) {
ForEach(trip.days, id: \.id) { day in
Button(action: {
withAnimation(.spring(duration: 0.3)) {
activeDate = day.date
}
}, label: {
VStack(spacing: 2) {
Text(day.date.formatDate(fromFormat: "yyyy-MM-dd", toFormat: "d") ?? "")
.background(activeDate == day.date ? Color.blue : Color.clear)
}
})
.id(day.date)
}
}
}
.onChange(of: activeDate) { oldValue, newValue in
print("Active date changed to: \(newValue)")
if let newValue {
withAnimation {
proxy.scrollTo(newValue, anchor: .center)
}
}
}
}
// VERTICAL CONTENT LIST
ScrollView {
LazyVStack(spacing: 0) {
ForEach($trip.days) { $day in
TripDayView(
tripId: trip.id,
day: $day
)
.id(day.date)
}
}
.scrollTargetLayout()
}
.scrollPosition(id: $activeDate, anchor: .top)
}
}
}
Код: Выделить всё
struct TripDayView: View {
@EnvironmentObject var tripManager: TripManager
let tripId: Int
@Binding var day: Day
@State private var showingActionSheet: Bool = false
var body: some View {
Section {
headerView
ListStopsView(tripId: tripId, stops: $day.stops)
}
}
var headerView: some View {
VStack(alignment: .leading, spacing: 0) {
HStack(spacing: 0) {
VStack(alignment: .leading, spacing: 0) {
Text(day.date.formatDate(fromFormat: "yyyy-MM-dd", toFormat: "EE, MMM d") ?? "")
}
Spacer()
Button(action: {
showingActionSheet = true
}, label: {
Image("Ellipsis Vertical")
})
.confirmationDialog("", isPresented: $showingActionSheet, titleVisibility: .hidden) {
Button("Option 1") {
//
}
Button("Option 2") {
//
}
Button("Option 3") {
//
}
}
}
}
}
}
Что является причиной этого? Как это исправить?
Похоже, это связано с .scrollPosition(), потому что, когда я закомментирую эту строку, она не прокручивается вверх, когда я нажимаю кнопку. Но мне нужно сохранить эту функциональность.
Подробнее здесь: https://stackoverflow.com/questions/798 ... n-a-button
Мобильная версия