본문 바로가기

UIKIT/UICalendar

🤔 UICalendar 만들어보기 (오늘 날짜 표시)

https://developer.apple.com/documentation/uikit/uicalendarview

 

UICalendarView | Apple Developer Documentation

A view that displays a calendar with date-specific decorations, and provides for user selection of a single date or multiple dates.

developer.apple.com

 

📌 설정 및 사용법

CalenadarViewController 클래스는 iOS 16 이상에서 제공하는 UICalendarView를 사용하여 캘린더를 표시하는 기능을 합니다.

 

class CalenadarViewController: UIViewController {

    private let calendarView: UICalendarView = UICalendarView()
    
    // MARK: - Life Cycle
    override func viewDidLoad() {
        super.viewDidLoad()
        print("지금 시간: ", Date())
        view.backgroundColor = .white
        
        let gregorianCalendar = Calendar(identifier: .gregorian)
        calendarView.calendar = gregorianCalendar
        calendarView.locale = Locale(identifier: "ko_KR")
        calendarView.fontDesign = .rounded
        
        let today = Date()
        let todayComponents = gregorianCalendar.dateComponents([.year, .month, .day], from: today)
        
        // timeZone을 설정하는 경우
        //todayComponents.timeZone = TimeZone(identifier: "Asia/Seoul")
        
        
//        calendarView.visibleDateComponents = DateComponents(
//            calendar: gregorianCalendar,
//            timeZone: NSTimeZone(name: "Ko_KR") as TimeZone?,
//            year: 2025,
//            month: 3,
//            day: 13
//        )
        
        calendarView.visibleDateComponents = todayComponents
        
        setupUI()
    }

    
    private func setupUI() {
        view.addSubview(calendarView)
        calendarView.translatesAutoresizingMaskIntoConstraints = false
        
        NSLayoutConstraint.activate([
            
            calendarView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10),
            calendarView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10),
            calendarView.topAnchor.constraint(equalTo: view.topAnchor),
            calendarView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -150)
            
        ])
    }
}

 

✅ 오늘 날짜 가져오기 및 DateComponents로 변환

let today = Date()
let todayComponents = gregorianCalendar.dateComponents([.year, .month, .day], from: today)

 

  • Date()를 사용하여 현재 날짜를 가져옴
  • Calendar의 dateComponents([.year, .month, .day], from: today)를 사용하여 연, 월, 일만 가져오도록 설정

 

❗ timeZone을 설정해야 하는 경우

  • 특정한 시간대에서 항상 동일한 날짜를 유지해야 할 경우
  • Calendar의 timeZone이 기본 시스템 시간대가 아닌 특정 시간대로 동작해야 할 경우
let gregorianCalendar = Calendar(identifier: .gregorian)
var todayComponents = gregorianCalendar.dateComponents([.year, .month, .day], from: Date())

// ✅ 한국(KST) 시간대로 설정
todayComponents.timeZone = TimeZone(identifier: "Asia/Seoul")

calendarView.visibleDateComponents = todayComponents

 

 

  • timeZone을 설정하지 않아도 기본적으로 시스템 시간대(TimeZone.current)를 따라가기 때문에 정상적으로 동작
  • 특정한 시간대로 고정하고 싶다면 timeZone = TimeZone(identifier: "Asia/Seoul")을 추가하면 됨