지난 FSCalendar 게시글이 너무 길어져서 중간에 끊었었는데, 다시 이어가보려고 합니다.
지난 게시글 링크입니다!
2024.07.14 - [Swfit] - [iOS] About FSCalendar - 1
4번부터 다시 이어가보겠습니다.
위 아래로 스와이프 할 때마다 월간, 주간 달력을 바꿔줄겁니다.
사실 버튼 하나 추가해서 바꿔줄 수도 있었지만
FSCalendar 공식문서 페이지에 이 기능을 담은 영상을 보고 꼭 해보고싶어서 구현해봤습니다!
제가 사용한 기능은
UIPanGestureRecognizer이고
손가락으로 화면을 드래그하는 제스처를 인식하는 데 사용되는 GestureRecognizer라고합니다.
제가 처음으로 구현한 코드는 다음과 같습니다.
private var chooseMonthOrWeek = true
private lazy var calendarView = {
let calendar = FSCalendar()
calendar.delegate = self
calendar.dataSource = self
calendar.scope = .month
calendar.appearance.headerDateFormat = "YYYY년 MM월"
calendar.appearance.eventDefaultColor = UIColor.red
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(panGestureHandler))
calendar.addGestureRecognizer(panGestureRecognizer)
return calendar
}()
@objc func panGestureHandler() {
chooseMonthOrWeek.toggle()
calendarView.scope = chooseMonthOrWeek ? .month : .week
}
처음엔 너무 쉽다 생각하고 싱글벙글 CMD + R 꾸욱 눌렀습니다.
그러고 확인해보니
zㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 난리가 났더군요.
어떻게든 해결해보려고 이것저것 찾아보다가 사이버 스승님을 한 분 만나게 됩니다.
이 분입니다. 보고 깨달았습니다.
https://www.youtube.com/watch?v=cOcjrmFp2v8
+ 저는 제가 쓸 부분만 쏙 골라 먹었습니다.
또 바로 만들기 보단 좀 따라해보면서 기능에 대해 익혀봤는데, 상당히 재미집니다.
panGestureHandler 메서드만 바꿔주면 됩니다.
@objc func panGestureHandler() {
if gesture.state == .began {
print("began")
} else if gesture.state == .changed {
print("changing")
} else if gesture.state == .ended {
print("the end")
}
}
하고 확인해보면!!
직관적으로 딱 알기 좋더라고요. state가 end일 때
Month > Week
혹은
Week > Month
해주면 되겠죠?
최종적으로 다음과 같은 코드로 구성하고 실행시켜 보면
override func bindData() {
viewModel.monthOrWeek.bindLater { [weak self] calendar in
guard let calendar = calendar else { return }
self?.calendarView.scope = calendar ? .month : .week
self?.updateTableView()
}
}
@objc func panGestureHandler(gesture: UIPanGestureRecognizer) {
if gesture.state == .ended {
viewModel.monthOrWeek.value?.toggle()
}
}
func updateTableView() {
calendarView.snp.updateConstraints { make in
make.height.equalTo(viewModel.monthOrWeek.value ?? false ? 300 : 130)
}
searchTableView.snp.updateConstraints { make in
make.top.equalTo(calendarView.snp.bottom)
}
}
음.. 여기선 viewModel의 monthOrWeek을 통해 T/F를 전달했는데,
요부분은 VC로 빼도 되지 않을까 라는 고민을 해봅니다.
아직 공부중이라 어떤 코드까지 비즈니스 로직으로 빼야겠다는 기준이 명확하지 않은것 같네요..
고민을 더 해봐야 할 부분이겠죠?
Anyway!
확인해보면
잘 돌아갑니다.
좌우 스와이프는 월을 바꿔주고
상하 스와이프는 주간 월간 달력을 바꿔줍니다!
.
.
.
UI만 좀 손 보면 쓸만하지 않을까요??
아 자동적으로 5번까지 구현해버렸네요.
updateContraints를 활용해서요!
이 내용은
2024.07.17 - [Swfit] - [iOS] About SnapKit
여기에
담아 두었습니다. 어렵지 않아요
그럼 이번 게시글도 여기까지이고
.
.
.
.
'Swift' 카테고리의 다른 글
[iOS] About 램 모델클래스 > 구조체 (0) | 2024.08.08 |
---|---|
[iOS] About Property Wrapper (0) | 2024.08.04 |
[iOS] About SnapKit (2) | 2024.07.17 |
[iOS] About FSCalendar - 1 (0) | 2024.07.14 |
[iOS] About 컬렉션뷰 속성 (0) | 2024.07.10 |