swiftUI calendar 커스텀 하기
SwiftUI 캘린더 커스텀 하기
SwiftUI는 신속하고 직관적인 방식으로 사용자 인터페이스를 구축할 수 있는 도구를 제공합니다. 특히, 캘린더는 많은 앱에서 자주 사용되는 기능입니다. 이 글에서는 SwiftUI를 사용하여 커스텀 캘린더를 만드는 방법을 단계별로 설명합니다.
기본적인 캘린더의 구조 이해하기
캘린더를 만들기 위해서는 우선 날짜와 시간을 다루는 Date
와 Calendar
객체를 활용해야 합니다. Swift에서는 Date
객체를 통해 년, 월, 일 등의 값을 쉽게 조작할 수 있도록 다양한 메서드를 제공합니다.
swiftlet calendar = Calendar.current let date = Date() let components = calendar.dateComponents([.year, .month, .day], from: date)
위 코드에서는 현재 날짜와 시간의 년, 월, 일 정보를 얻어옵니다. 다음으로, DateFormatter
를 이용하여 날짜를 원하는 형식으로 변환할 수 있습니다.
swiftlet formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd" let dateString = formatter.string(from: date)
캘린더의 기본 UI 구성하기
SwiftUI에서는 List
와 ForEach
를 이용하여 날짜를 목록 형식으로 쉽게 나열할 수 있습니다. 기본적인 캘린더 뷰를 구성해봅시다.
swiftimport SwiftUI struct CalendarView: View { let calendar = Calendar.current let dates: [Date] = { var dates = [Date]() let today = Date() for i in 0..<30 { if let date = calendar.date(byAdding: .day, value: i, to: today) { dates.append(date) } } return dates }() var body: some View { List(dates, id: \.self) { date in Text("\(date, formatter: DateFormatter.shortDate)") } } }
위 코드에서는 현재 날짜부터 30일간의 날짜를 List
로 나열한 간단한 캘린더를 만듭니다. 원하는 형식으로 날짜를 표시하기 위해 DateFormatter.shortDate
를 사용했습니다.
날짜 셀 커스텀하기
각 날짜 셀을 커스텀하여 더 멋진 UI를 구성할 수 있습니다. 예를 들어, 특정 날짜에 이벤트가 있는 경우 해당 날짜를 강조합니다.
swiftimport SwiftUI struct CalendarView: View { let calendar = Calendar.current let dates: [Date] = { var dates = [Date]() let today = Date() for i in 0..<30 { if let date = calendar.date(byAdding: .day, value: i, to: today) { dates.append(date) } } return dates }() var body: some View { List(dates, id: \.self) { date in CalendarDateView(date: date) } } } struct CalendarDateView: View { let date: Date let formatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd" return formatter }() var body: some View { HStack { Text(formatter.string(from: date)) .padding() .background(Color.blue) .cornerRadius(8) .foregroundColor(.white) Spacer() } .padding(.vertical, 4) } }
이제 각 날짜 셀이 파란색 배경으로 강조되고, 둥근 모서리를 가진 디자인으로 바뀝니다.
월별 캘린더 구성하기
마지막으로, 월별로 캘린더를 구성하여 보겠습니다. SwiftUI의 Grid
레이아웃을 활용하여 각 날짜를 달력 형태로 배치합니다.
swiftimport SwiftUI struct MonthlyCalendarView: View { @State private var currentDate = Date() private let calendar = Calendar.current private let formatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "MMM yyyy" return formatter }() var body: some View { VStack { Text(formatter.string(from: currentDate)) .font(.title) .padding() let days = generateDays(for: currentDate) LazyVGrid(columns: Array(repeating: .init(.flexible()), count: 7)) { ForEach(days, id: \.self) { date in Text("\(calendar.component(.day, from: date))") .frame(maxWidth: .infinity, minHeight: 40) .background(Color.gray.opacity(0.2)) .cornerRadius(4) } } .padding() } } func generateDays(for month: Date) -> [Date] { guard let monthInterval = calendar.dateInterval(of: .month, for: month) else { return [] } var days: [Date] = [] var date = monthInterval.start repeat { days.append(date) date = calendar.date(byAdding: .day, value: 1, to: date)! } while date < monthInterval.end return days } }
이제 월별 캘린더가 생성되며, 각 날짜가 그리드 레이아웃으로 배치됩니다. 이 방법을 통해 복잡한 캘린더 기능을 커스텀할 수 있습니다.
SwiftUI를 사용하여 캘린더를 커스터마이징하는 것은 다소 복잡할 수 있지만, 기본적인 캘린더 구조를 이해하고, Date
, DateFormatter
, Calendar
객체를 효과적으로 사용하는 방법을 알면 쉽게 구현할 수 있습니다.