import SwiftUI struct YearMonthCalendarView: View { @State var selectedYear: Int = Calendar.current.component(.year, from: Date()) @State var selectedMonth: String = Date().monthShort let months: [String] = Calendar.current.shortMonthSymbols @State var dateRange: Range<Date> var body: some View { // Year View VStack(spacing:0) { Group { HStack { Image(systemName: "chevron.left") .foregroundColor(.white) .frame(width: 24.0) .onTapGesture { selectedYear -= 1; selectedMonth = "" } Text(String(selectedYear)).foregroundColor(.white).font(.textBold) .transition(.move(edge: .trailing)) Spacer() Image(systemName: "chevron.right") .foregroundColor(.white) .frame(width: 24.0) .onTapGesture { selectedYear += 1; selectedMonth = "" } }.padding(.all, 12.0) .background(.blue) } Group { ScrollView(.horizontal) { HStack() { ForEach(months, id: \.self) { item in Text(item) .foregroundColor((item == selectedMonth) ? .blue:.black) .padding(.all, 12.0) .onTapGesture { self.setPeriod(selectedMonth: item) } } } } } Divider() } .onAppear() { selectedYear = Int(dateRange.lowerBound.yearFull)! selectedMonth = dateRange.lowerBound.monthShort } } func setPeriod(selectedMonth: String) { self.selectedMonth = selectedMonth let dateFormatter = DateFormatter() dateFormatter.dateFormat = "dd/MMM/yyy" let startDate = dateFormatter.date(from: "01/" + selectedMonth + "/" + String(selectedYear)) let endDate = startDate?.endOfMonth self.dateRange = .init(uncheckedBounds: (lower: startDate!, upper: endDate!)) } } struct YearMonthCalendarView_Previews: PreviewProvider { static var previews: some View { YearMonthCalendarView(dateRange: .init(uncheckedBounds: (lower: Calendar.current.date(byAdding: .month, value: 2, to: Date())!.startOfMonth, upper: Calendar.current.date(byAdding: .month, value: 2, to: Date())!.endOfMonth))) } }