다이어리에서 캘린더 기능은 빠질 수 없다고 생각한다. 사용자가 쓴 일기를 캘린더를 통해서 한 눈에 바라볼 수 있어서 관리가 편하기 때문이다. 그럼, 어떤 종류의 캘린더를 써야할까? 처음에는 Apple에서 지원하는 캘린더기능이 빈약하고 외부 라이브러리로 쓰는 캘린더가 커스텀할 수 있는 방법과 적용이 매우 쉬워서 FSCalendar을 쓰려고 했다. 근데, Apple에서 2022년 중반기 즈음에 UICalendarView라는 프레임워크를 발표했고 실제로 적용해보니 외부 라이브러리와의 장단점이 명확했다.
우선, 나는 기존의 프레임워크를 하나라도 더 알아가는 게 좋다고 판단했고 무엇보다도 기본 디자인이 너무 간단명료하면서도 세련되었다고 생각해서 UICalendarView를 선택했다.
우선 다른 view component의 과정과 동일하게 진행된다.
1. calendarview 객체 생성
private lazy var calendarView : UICalendarView = {
var view = UICalendarView()
view.wantsDateDecorations = true
return view
}()
calendarView.snp.makeConstraints { make in
make.centerX.equalTo(view)
make.trailing.equalTo(view.safeAreaLayoutGuide.snp.trailing).offset(-10)
make.top.equalTo(view.safeAreaLayoutGuide.snp.top).offset(10)
}
//calendarVC
private func customCalendar() {
calendarView.tintColor = .mainTheme
calendarView.backgroundColor = .mainCell
calendarView.calendar = Calendar(identifier: .gregorian)
calendarView.locale = Locale(identifier: "ko-KR")
calendarView.fontDesign = .rounded
calendarView.layer.cornerRadius = 10
calendarView.delegate = self
}
// 날짜를 탭했을 때, delegete 설정
private func dateSelectCalendar() {
let dataSelection = UICalendarSelectionSingleDate(delegate: self)
calendarView.selectionBehavior = dataSelection
}
// 날짜 구간 설정, 2024년 이전으로는 설정 불가
private func setDateComponents() {
let fromDateComponents = DateComponents(
calendar: calendarView.calendar,
year: 2024,
month: 1,
day: 1
)
guard let fromDate = fromDateComponents.date else {
fatalError("Invalid date components: \(fromDateComponents)")
}
let calendarViewDateRange = DateInterval(start: fromDate, end: .distantFuture)
calendarView.availableDateRange = calendarViewDateRange
}
}
extension CalendarVC: UICalendarViewDelegate, UICalendarSelectionSingleDateDelegate {
//날짜 선택했을 시, 메서드 구성
func dateSelection(_ selection: UICalendarSelectionSingleDate, didSelectDate dateComponents: DateComponents?) {
let vc = DiaryListVC()
vc.hidesBottomBarWhenPushed = true
navigationController?.pushViewController(vc, animated: true)
}
//날짜에 데이터를 추가하여 표현하는 방법 구성
func calendarView(_ calendarView: UICalendarView, decorationFor dateComponents: DateComponents) -> UICalendarView.Decoration? {
guard let day = dateComponents.day else {
return nil
}
//짝수날은 불 꺼진 상태, 홀수날은 불 켜진 상태 구성
if day.isMultiple(of: 2) {
return .default(color: .subBackground, size: .medium)
} else {
return .default(color: .mainTheme, size: .medium)
}
}
//날짜를 선택할 수 있는 조건 구성
func dateSelection(_ selection: UICalendarSelectionSingleDate, canSelectDate dateComponents: DateComponents?) -> Bool {
guard let day = dateComponents?.day else { return false }
// 짝수날은 비활성, 홀수날은 활성 상태 구성
if day % 2 == 0 {
return false
} else {
return true
}
}
}
사실 우리의 집중 전략은 캘린더에 있지 않기 때문에, 기본적인 기능에 충실한 UICalendarView 만으로도 충분하다고 판단했다. 캘린더는 데이터 바인딩을 통해 일기를 쓴 날에만 날짜를 선택할 수 있게 하며, 선택된 날짜의 일기를 새로운 뷰를 통해 보여줄 수 있도록 로직을 짜야한다. 우선 기초 틀은 완성이 되었다