Прокрутка на основе выбранного индекса и действий кнопок в SWIFTUI
Я хочу сделать вид прокрутки с помощью действия кнопки в SwiftUI
Для этого я пишу следующий код, используя ScrollViewReader, но он выдает мне ошибку.
Выдает ошибку при использовании неразрешенного идентификатора ScrollViewReader
найдите мой код следующим образом.
Кто-нибудь дает представление об этой проблеме.
Ожидаемый результат выглядит следующим образом:
struct ContentView: View {
@State var days = [CalendarDay]()
@State var selectedDay: Int = 0
var body: some View {
ScrollViewReader { scrollProxy in
HStack {
Button(action: {
if selectedDay > 0 {
for j in days.indices { days[j].isToday = false }
days[selectedDay-1].isToday = true
selectedDay -= 1
withAnimation { scrollProxy.scrollTo(selectedDay) }
}
}) {
Image(systemName: "chevron.left.circle.fill")
}
ZStack{
VStack {
ScrollView(.horizontal, showsIndicators: false){
HStack(spacing: 20) {
ForEach(days.indices, id: \.self) { i in
CalendarView(
number: days[i].number,
days: days[i].weekday,
color: days[i].isToday ? #colorLiteral(red: 0.9060331583, green: 0.2547450066, blue: 0.3359550834, alpha: 1) : #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1),
textcolor: days[i].isToday ? #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1) : #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)
).onTapGesture {
selectedDay = i
for j in days.indices {
if j == i {
days[i].isToday = true
} else {
days[j].isToday = false
}
}
}
}
}
.padding(.leading,10)
.padding(.bottom, 10)
.shadow(radius: 3, x: 3, y: 3)
}
}
}
Button(action: {
if selectedDay < days.count-1 {
for j in days.indices { days[j].isToday = false }
days[selectedDay+1].isToday = true
selectedDay += 1
withAnimation { scrollProxy.scrollTo(selectedDay) }
}
}) {
Image(systemName: "chevron.right.circle.fill")
}
}
}
.onAppear {
getCurrentWeekdays()
}
}
func getCurrentWeekdays() {
/// from https://stackoverflow.com/a/62355272/14351818
let dateComponents = Calendar(identifier: .gregorian).dateComponents([.yearForWeekOfYear, .weekOfYear], from: Date())
let startOfWeek = Calendar(identifier: .gregorian).date(from: dateComponents)!
let startOfWeekNoon = Calendar(identifier: .gregorian).date(bySettingHour: 12, minute: 0, second: 0, of: startOfWeek)!
days = (0...6).map {
let calendar = Calendar(identifier: .gregorian)
let date = calendar.date(byAdding: .day, value: $0, to: startOfWeekNoon)!
let numberDateFormatter = DateFormatter()
numberDateFormatter.dateFormat = "d"
let number = numberDateFormatter.string(from: date)
let weekdayDateFormatter = DateFormatter()
weekdayDateFormatter.dateFormat = "E"
let weekday = weekdayDateFormatter.string(from: date)
let calendarDay = CalendarDay(
number: number,
weekday: weekday,
isToday: calendar.component(.day, from: Date()) == calendar.component(.day, from: date)
)
// <--- here --->
if calendar.component(.day, from: Date()) == calendar.component(.day, from: date) {
selectedDay = $0
}
return calendarDay
}
}
}