Измените представление прокрутки с помощью Butotnactios в iOS 13.0 SwiftUI

#ios #swift #date #swiftui

Вопрос:

Я должен был показать даты в Hstack Scrollview.

У меня есть левая и правая кнопки

Мне нужно выполнить действие прокрутки с помощью этих кнопок, как показано ниже на изображении.введите описание изображения здесь

Здесь условие основано на действиях кнопки, которые необходимо прокрутить, и когда мы в первый раз выходим на экран, на нем сначала отображается текущая дата, т. е. последний индекс

Я пишу следующий код для всех, кто помогает мне в этой области.

 import SwiftUI

struct ContentView: View {
    
    var body: some View {
        
        return HStack{
            
            Button(action://Some action Here)
            
            self.datesScrollview()
            
            Button(action://Some action Here)
        }
    }
    
    
    //GET RAnge dates and return those in Scrollview
    private func datesScrollview()-> some View{
        var days = [CalendarDay]()
        
        let datestring = "2021-06-25T07:00:00Z"
        let dateformater = DateFormatter()
        
        if let date = dateformater.date(from: datestring){
            let rangedays = datesRange(from: date.convertTimezone(timezone: "PST"), to: Date().convertTimezone(timezone: "PST"))
            
            for date in rangedays{
                
                let numberDateFormatter = DateFormatter()
                numberDateFormatter.dateFormat = "d"
                let number = numberDateFormatter.string(from: date)
                
                
                let weekdayDateFormatter = DateFormatter()
                weekdayDateFormatter.dateFormat = "E"
                let weekday = weekdayDateFormatter.string(from: date).prefix(1)
                
                
                var today:Bool
                if numberDateFormatter.string(from: date) == numberDateFormatter.string(from: Date().convertTimezone(timezone: "PST")){
                    today = true
                }else{
                    today = false
                }
                
                let calendarDay = CalendarDay(
                    number: number,
                    weekday: String(weekday),
                    isToday: today)
                days.append(calendarDay)
            }
        }
        return
            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{
                                print(days[i])
                                // this is just for replacing the current selection
                                for j in days.indices {days[j].isToday = false }
                                days[i].isToday = true
                        }
                    }}
                    .padding(.leading,10)
                    .padding(.bottom, 10)
                    .shadow(radius: 3, x: 3, y: 3)
        }
    }
    
    
    func datesRange(from:Date, to:Date)->[Date]{
        
        if from > to {return [Date]()}
        
        var tmpdate = from
        var array:[Date] = []
        
        while tmpdate <= to {
            array.append(tmpdate)
            tmpdate = Calendar.current.date(byAdding: .day,value: 1, to: tmpdate)!
        }
        return array
    }
}


struct CalendarDay: Identifiable {
    let id = UUID()
    var number: String
    var weekday: String
    var isToday: Bool
}

struct CalendarView: View {
    var number : String
    var days : String
    var color : UIColor
    var textcolor : UIColor
    
    var body: some View {
        VStack{
            Text(self.number)
                .font(.system(size: 20, weight: .bold, design: .rounded))
                .foregroundColor(Color(self.textcolor))
            Text(self.days)
                .font(.headline)
                .foregroundColor(Color(self.textcolor))
        }.padding([.top,.bottom], 10)
            .padding([.leading,.trailing],10)
            .background(Color(self.color))
            .cornerRadius(30)
    }
}

extension Date{
    func convertTimezone(timezone:String)-> Date{
        
        if let targettimeZone = TimeZone(abbreviation: timezone){
            let delta = TimeInterval(targettimeZone.secondsFromGMT(for: self) - TimeZone.current.secondsFromGMT(for: self))
            return addingTimeInterval(delta)
        }else{
            return self
        }
    }
}