본문 바로가기
Swift

[iOS] About FsCalendar - 2

by dsungc 2024. 7. 20.

지난 FSCalendar 게시글이 너무 길어져서 중간에 끊었었는데, 다시 이어가보려고 합니다.

 

지난 게시글 링크입니다!

 

2024.07.14 - [Swfit] - [iOS] About FSCalendar - 1

 

 

4번부터 다시 이어가보겠습니다.

 

위 아래로 스와이프 할 때마다 월간, 주간 달력을 바꿔줄겁니다.

사실 버튼 하나 추가해서 바꿔줄 수도 있었지만

FSCalendar 공식문서 페이지에 이 기능을 담은 영상을 보고 꼭 해보고싶어서 구현해봤습니다!

 

제가 사용한 기능은

Apple 공식문서

 

 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