#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
}
}
}