โœ๏ธ TIL

[ TIL ] UICalenderView ์™€์˜ ์‹ธ์›€.. / 24๋…„ 3์›” 26์ผ

EarthSea 2024. 3. 26. 20:11

 

์ถœ์ฒ˜ : ํ•€ํ„ฐ๋ ˆ์ŠคํŠธ

 

 

์•ˆ๋…•ํ•˜์„ธ์š”๐Ÿ˜„ ์˜ค๋Š˜ ์ •๋ง ์ง‘์ค‘๋„ ์•ˆ๋˜๊ณ , ์ œ๋Œ€๋กœ ๊ตฌํ˜„ํ•ด๋‚ธ ๊ฒƒ๋„ ์—†๋Š” ํ•˜๋ฃจ์ž…๋‹ˆ๋‹ค.

๋ญ! ์ด๋Ÿฐ ๋‚ ๋„ ์žˆ๋Š” ๊ฑฐ๊ฒ ์ฃ ?!

 

UICalendarView ์ž์‹์ด ๋ญ๋ผ๊ณ  ๋‚ด ๊ธฐ๋ฅผ ์ฃฝ์—ฌ!

 

 

์˜ค๋Š˜ ๋ฐฐ์šด ๊ณต๋ถ€๋ฅผ ์ •๋ฆฌํ•ด๋ด…์‹œ๋‹ค~!

1์ผ 1๋กœ๊ทธ 100์ผ ์™„์„ฑ์˜ ์ฒซ ๋‹จ์ถ”๋ฅผ ๊ฟฐ๋ฉ”์—ˆ๋Š”๋ฐ์š”!

์˜ค๋Š˜์˜ ๋‚ด์šฉ์€ ํ•˜๋“œ์›จ์–ด์˜ ์—ญ์‚ฌ..? ์ปดํ“จํ„ฐ์˜ ์—ญ์‚ฌ..? ์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™์•„์š”! ( ์‚ฌ์‹ค ์˜ค๋Š˜ ์ข€ ๋Œ€์ถฉ.. ์ฝ.. ํฌํ .. )

 

 

์˜ค๋Š˜์€ UICalenderView์—์„œ ํ•ด๋‹น ๋‚ ์งœ๋ฅผ ํด๋ฆญํ•˜์˜€์„ ๋•Œ,
์ƒˆ๋กœ์šด ViewController๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉด์„œ ๋‹ฌ๋ ฅ์˜ ๋‚ ์งœ ํ˜•์‹์„ ๋„˜๊ฒจ์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์–ด์š”!

 

UICalendarSelectionSingleDateDelegate

UICalenderView์—์„œ๋Š” ๋‹จ์ผํ•œ ๋‚ ์งœ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” UICalenderSelectionSingleDateDelegate ์ด๋ผ๋Š” ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ์ฑ„ํƒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค! ์„ ํƒ ๊ฐ€๋Šฅํ•œ ๋‚ ์งœ์™€ ๋‹จ์ผ ๋‚ ์งœ ์„ ํƒ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ๋“ค์„ ์ฒ˜๋ฆฌํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค!

 

๋‹ฌ๋ ฅ์—์„œ ํŠน์ • ๋‚ ์งœ๋ฅผ ์„ ํƒํ–ˆ์„ ๋•Œ์˜ ๋™์ž‘ ๊ตฌํ˜„ ํ•จ์ˆ˜

func dateSelection(_ selection: UICalendarSelectionSingleDate, didSelectDate dateComponents: DateComponents?) {
   	// ๊ตฌํ˜„
}

 

์œ„์˜ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋‹ฌ๋ ฅ์—์„œ ์„ ํƒํ•œ ๋‚ ์งœ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์š”!

 

์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ selection: UICalendarSelectionSingleDate ๋Š” ์„ ํƒ๋œ ์บ˜๋ฆฐ๋”์˜ ๊ฐ์ฒด์ด๊ณ ,

๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ didSelectDate dateComponents: DateComponents? ๋Š” ์„ ํƒ๋œ ๋‚ ์งœ์˜ dateComponents ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

 

 

CalendarViewController์˜ ํ™•์žฅ ํด๋ž˜์Šค

extension CalendarViewController: UICalendarSelectionSingleDateDelegate {
    func dateSelection(_ selection: UICalendarSelectionSingleDate, didSelectDate dateComponents: DateComponents?) {
        
        guard let dateComponents = dateComponents else { return }
        
        // ์„ ํƒํ•œ ๋‚ ์งœ๋ฅผ Date๋กœ ๋ณ€ํ™˜
        if let selectedDate = Calendar.current.date(from: dateComponents) {
            showToDoListViewController(with: selectedDate)
        } else {
            print("DateComponents๋ฅผ Date๋กœ ๋ณ€ํ™˜ ์‹คํŒจ")
        }
    }
    
    func showToDoListViewController(with date: Date) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        guard let toDoListViewController = storyboard.instantiateViewController(withIdentifier: "ToDoListViewController") as? ToDoListViewController else {
            return
        }
        toDoListViewController.selectedDate = date
        
        // ToDoListViewController๋ฅผ presentํ•˜์—ฌ ํ‘œ์‹œ
        toDoListViewController.modalPresentationStyle = .overFullScreen
        toDoListViewController.modalTransitionStyle = .coverVertical
        present(toDoListViewController, animated: true, completion: nil)
    }
}

 

์ €๋Š” ์ƒˆ๋กœ์šด ViewController์—๊ฒŒ ๋‚ ์งœ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์งฐ์Šต๋‹ˆ๋‹ค.

์„ ํƒ๋œ ๋‚ ์งœ์˜ dateComponents๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด์ค€ ๋’ค Date๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ’์„ date๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ์–ด์š”.

 

 

โ˜‘๏ธ dateComponents๋ฅผ Dateํ˜•์‹์œผ๋กœ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ํ•จ์ˆ˜

let selectedDate = Calendar.current.date(from: dateComponents)

 

 

๋‹ค์Œ ํ™”๋ฉด์„ ์—ฐ๊ฒฐํ•ด์ค€ ๋’ค date๋กœ ๋ฐ”๊พผ ๊ฐ’์„ ๋„˜๊ฒจ์ฃผ์—ˆ์–ด์š”!!

 

 

 

ํ™”๋ฉด์˜ ๋นˆ ๋ถ€๋ถ„ ํด๋ฆญ์‹œ ํ™”๋ฉด ์ „ํ™˜

์ถ”๊ฐ€๋กœ ๊ตฌํ˜„ํ•œ ๋ถ€๋ถ„์€ ํ™”๋ฉด์˜ ๋นˆ๋ถ€๋ถ„์„ ํ„ฐ์น˜ํ–ˆ์„ ๋•Œ, ํ™”๋ฉด์ด ์ „ ํ™”๋ฉด์œผ๋กœ ์ „ํ™˜๋˜๊ฒŒ๋”ํ•˜๋Š” ๊ฒƒ๋„ ๊ตฌํ˜„์„ ํ–ˆ์–ด์š”!

 

// ํ„ฐ์น˜ ๊ฐ์ง€์šฉ UITapGestureRecognizer ์ƒ์„ฑ
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleOutsideTap))
        
// ViewController์˜ view์— ์ถ”๊ฐ€
self.view.addGestureRecognizer(tapGesture)

ํ•ด๋‹น ViewController ์˜ viewDidLoad() ํ•จ์ˆ˜ ๋ถ€๋ถ„์— ํ„ฐ์น˜ ๊ฐ์ง€์šฉ UITapGestureRecognizer ๋ฅผ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.

view ๋ถ€๋ถ„์„ ํˆฌ๋ช…์œผ๋กœ ์„ค์ •ํ•ด๋‘์–ด์„œ view ๋ถ€๋ถ„์— ํ„ฐ์น˜ ๊ฐ์ง€์šฉ UITapGestureRecognizer ๊ฐ€ ์ €์žฅ๋œ tapGesture ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ์–ด์š”!

 

// ๋ฐ”๊นฅ์ชฝ ์˜์—ญ ํ„ฐ์น˜ ์‹œ ํ˜ธ์ถœ๋  ๋ฉ”์„œ๋“œ
@objc func handleOutsideTap() {
    dismiss(animated: true, completion: nil)
}

์ถ”๊ฐ€๋กœ ํ•ด๋‹น ViewController์— ์œ„์˜ ํ•จ์ˆ˜๋งŒ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค!

ํ„ฐ์น˜๊ฐ€ ๊ฐ์ง€๋˜์—ˆ์„ ๋•Œ, ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์—์š”! ์ „ ํ™”๋ฉด์œผ๋กœ ๋Œ๋ ค์ฃผ๋Š” dismiss ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค!

 

์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•ด์„œ ๋†€๋žฌ์–ด์š”! ใ…Žใ…Ž

 

 

๊ตฌํ˜„ํ™”๋ฉด

 

 

 

๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด ํ• ์ˆ˜๋ก ๋ถ€์กฑํ•œ ์ ์ด ๋ณด์ด๊ณ , ๋” ๊ณต๋ถ€ํ•ด์•ผํ•  ๋ถ€๋ถ„์ด ๋ณด์ด๋„ค์š”!

๊ทธ๋ž˜์„œ ๋” ์กฐ๊ธ‰ํ•˜๊ฒŒ ๋งค์ผ ๋งค์ผ์„ ๋‹ฌ๋ ค๊ฐ€๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค..!

์•„์ง ๋ชจ๋ฅด๋Š”๊ฒŒ ์‚ฐ๋”๋ฏธ์—์š”!!!

์˜ค๋Š˜ ํ•˜๋ฃจ๋„ ์ˆ˜๊ณ ๋งŽ์•˜์–ด! ๋‚ด์ผ๋„ ํ™”์ดํŒ…!!!