티스토리 뷰
DatePickerView는 다양한 분야에서 사용되는 기능입니다.
이번 포스트는 이 DatePickerView 스크롤 시 다른 기능을 방지하는 것을 소개하려고 합니다.
DatePicker Scrolling 상태에서 DatePicker의 값을 가져오려고 시도 시 Scrolling 되어 있는 값이 아니라 초기값 또는 Scolling 이 완료되었을 때는 값을 가져오게 됩니다.
사용자 입장에서는 오류로 보일 수도 있기에 위의 동영상과 같이 스크롤 되고 있을 경우 버튼 클릭 방지 등 다른 작업을 할 수 없도록 방지하였습니다.
여기서 사용한 기능은 Guesture 기능과 UIScrollView의 Dragging Check Function 입니다.
* 소개할 예제는 DatePicker 가 Scrolling 시 "버튼" 동작 정지하고, Scrolling이 멈추게 되면 "동작" 할 수 있도록 구현한 소스 입니다.
1. Gesture 등록 및 delegate 연결
DatePicker가 스와이프 시점을 알기 위해서 Gesture을 동록해야합니다.
여기서 가장 중요한 부분은 delegate 연결입니다.
Gesture 마다 delegate을 연결하여 PickerView의 움직임에 따른 Gesture 감지 할 수 있도록 합니다.
//MARK: DatePicker 제스쳐 세팅
func settingDatePickerViewGesture(){
let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
swipeRight.direction = UISwipeGestureRecognizerDirection.right
// Gesture Delegate을 통하여 DatePicker 안에서 Gesture을 판단할 수 있습니다.
swipeRight.delegate = self
_datePicker.addGestureRecognizer(swipeRight)
let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
swipeDown.direction = UISwipeGestureRecognizerDirection.down
swipeDown.delegate = self
_datePicker.addGestureRecognizer(swipeDown)
let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
swipeUp.direction = UISwipeGestureRecognizerDirection.up
swipeUp.delegate = self
_datePicker.addGestureRecognizer(swipeUp)
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
2. View extent 선언
실질적으로 Scrolling 을 체크하는 부분 입니다.
DatePicker 뷰는 UIScrollView 을 상속 받고 있기에 ScrollView의 함수인 "isDragging"을 사용할 수 있는 것으로 보입니다.
UIScrollView의 isDragging 또는 isDeceleration으로 스크롤링을 체크합니다.
//MARK: DatePicker 제스쳐 세팅
func settingDatePickerViewGesture(){
let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
swipeRight.direction = UISwipeGestureRecognizerDirection.right
// Gesture Delegate을 통하여 DatePicker 안에서 Gesture을 판단할 수 있습니다.
swipeRight.delegate = self
_datePicker.addGestureRecognizer(swipeRight)
let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
swipeDown.direction = UISwipeGestureRecognizerDirection.down
swipeDown.delegate = self
_datePicker.addGestureRecognizer(swipeDown)
let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
swipeUp.direction = UISwipeGestureRecognizerDirection.up
swipeUp.delegate = self
_datePicker.addGestureRecognizer(swipeUp)
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
3. 제스터 입력 시 마다 호출 하는 함수
Gesture 입력 시 마다 "버튼" 동작을 disable 상태로 변경하고, extent로 선언하였던 waitTillDoneScrolling()을 호출합니다.
waitTillDoneScrolling()의 Closer로 선언한 Completion()이 호출되면 "버튼" 동작을 enable로 변경하여 동작할 수 있도록 합니다.
// Guesture 동작 있을 때 마다 호출 합니다.
@objc func respondToSwipeGesture(gesture: UIGestureRecognizer) {
// 스크롤 시작 시 Scrolling...으로 버튼을 변경합니다.
self._button.setTitle("Scrolling...", for: .normal)
self._button.isEnabled = false
self._button.backgroundColor = Utils.hexStringToUIColor(hex: "FF8FAE")
// 스크롤링 상태에 따른 표시
_datePicker.waitTillDoneScrolling(completion: {
print("completion")
self._button.setTitle("Completion", for: .normal)
self._button.isEnabled = true
self._button.backgroundColor = Utils.hexStringToUIColor(hex: "7CB0FF")
})
// 스크롤 방향에 따른 표시
if let swipeGesture = gesture as? UISwipeGestureRecognizer {
switch swipeGesture.direction {
case UISwipeGestureRecognizerDirection.right:
print("Swiped right")
case UISwipeGestureRecognizerDirection.down:
print("Swiped down")
case UISwipeGestureRecognizerDirection.left:
print("Swiped left")
case UISwipeGestureRecognizerDirection.up:
print("Swiped up")
default:
break
}
}
}
4. 다른 방식인 DatePickerView Action
DatePickerView의 ValueChangedTimePicker(_) 라는 IBAction이 있습니다. extension에서 스크롤링이 종료됬을 경우 event처리하는 것을 IBAction에서 처리해주면 됩니다.
1. Gesture 체크를 통한 상,하 이동 시 Button disable 처리
2. PickerView의 ValueChangedTimePicker() 된 시점에 Button enable 처리
@IBAction func ValueChangedTimePicker(_ sender: Any) {
self._button.setTitle("Completion", for: .normal)
self._button.isEnabled = true
self._button.backgroundColor = Utils.hexStringToUIColor(hex: "7CB0FF")
}
정리
@IBAction func ValueChangedTimePicker(_ sender: Any) {
self._button.setTitle("Completion", for: .normal)
self._button.isEnabled = true
self._button.backgroundColor = Utils.hexStringToUIColor(hex: "7CB0FF")
}
참고사이트
* https://stackoverflow.com/questions/24215117/how-to-recognize-swipe-in-all-4-directions
* https://stackoverflow.com/questions/9202283/uipickerview-detect-rolling-wheel-start-and-stop
'프로그래밍 > iOS' 카테고리의 다른 글
[SWIFT] CallKit 구현 (수신자 확인) [2/3] (0) | 2017.12.29 |
---|---|
[SWIFT] CallKit 구현 (수신자 확인) [1/3] (2) | 2017.12.29 |
[SWIFT] 로그인 모듈 구성 [3/3] - 페이스북 로그인 (0) | 2017.12.20 |
[SWIFT] 로그인 모듈 구성 [2/3] - 구글 로그인 (0) | 2017.12.20 |
[SWIFT] 로그인 모듈 구성 [1/3] -카카오 로그인 (2) | 2017.12.20 |
- 고시문헬퍼
- missionchina
- 임용고시
- issue
- 탁구
- Android Studio
- 점수판
- swift
- Kotlin
- 선교
- 미션차이나센터
- 알고리즘
- IOS
- flutter
- Android
- java
- push
- DI
- missioon
- view
- 안드로이드
- RXjava
- 패턴
- IT
- 코틀린
- 스코어헬퍼
- MCC
- 고시문
- 디자인패턴
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |