제스처를 사용하는 방법은 간단합니다.
자! 저는 지금부터 infoView라는 제가 만든 View에 왼쪽으로 Swipe했을 때 어떤 동작이 실행되도록 해보겠습니다!!
먼저 우리는 제스처 인식기를 만들어주어야 합니다.
let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(infoviewSwipeLeft))
여기서 만든 제스처 인식기는 제스처가 인식되면 infoviewSwipeLeft 라는 @objc 함수를 실행합니다!!!
이 함수의 내용은 우리가 구현하기 나름이겠죠??
자 그럼 어떤 제스처이냐??
우리는 UISwipeGestureRecognizer라는 제스처 인식기를 만들었죠?
그러면 이 제스처 인식기의 방향을 다음과 같이 설정해줄 수 있어요.
swipeLeft.direction = UISwipeGestureRecognizer.Direction.left
다음과 같이 더 짧게 사용할 수도 있습니다.
swipeLeft.direction = .left
자 그럼 우리는 왼쪽으로 스와이프를 감지했을 때, infoviewSwipeLeft 함수를 실행하는 스와이프 제스처 인식기를 완성한겁니다!!ㅎㅎ
음.. 그럼 이제 이 인식기를 우리가 원하는 View에 달아주어야겠죠??
그래야 이 View에 어떤 제스처가 가해졌을 때, 저희의 인식기가 "딱"하고 인식을 할거니깐요!!
자! 저는 제 infoVIewdp 다음과 같이 인식기를 달아주었습니다.
infoView.addGestureRecognizer(swipeRight)
이제 왼쪽으로 스와이프 하면 infoviewSwipeLeft 함수가 실행되요!!
아.. 너무 쉽죠???
근데 나가시면 안되요.. 정말 중요한게 몇개 남았거든요.
자.. 갑자기 infoView에 Tap 제스처도 넣고 싶어졌어요.
tap 제스처는 말 그대로 뷰가 탭 되었을때, 어떤 동작을 실행할 수 있도록 해주는거에요.
마치 버튼..같죠??
탭 제스처는 다음과 같이 UITapGestureRecognizer를 사용합니당.
let tap = UITapGestureRecognizer(target: self, action: #selector(infoviewTap))
탭은 따로 방향이 없기 때문에 direction을 설정하지 않으셔도 되고, 바로 View에 달아주기만 하시면 되요!
infoView.addGestureRecognizer(tap)
자 그럼 이제 됐을까요??
하지만 실행해보면... 둘중에 하나만 인식할거에요ㅋㅋㅋ
왜냐면 우리의 인식기는 한번에 한가지만 인식할 수 있기 때문이죠.
Swipe Tap Scroll 등등 여러 제스처를 view에 추가해주었다고 해도 이중에 하나만 인식할 수 있어요...
아마 비슷한 동작으로 여러 함수가 실행되는 것을 막기 위해 이렇게 해놓은 듯 해요!!
자 그럼 우리는 어떻게 해야 하느냐??
우리는 UIGestureRecognizer를 여러 제스처들을 다 인식할 수 있도록 이를 수정해주어야 합니다.
근데 우리는 UIGestureRecognizer을 뜯어서 고칠 수가 없는걸요??
그래서 Swift에는 Delegate가 있지 않습니까??
애플은 고맙게도 이 부분을 우리가 간단하게 컨트롤 할 수 있도록 만들어놓으셨습니다..ㅎㅎ
extension MainViewController: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}
자. 저 함수를 보면 눈치 빠른 사람들을 이미 눈치채셨을거에요
shouldRecognizeSimultaneouslyWith otherGestureRecognizer 라는 걸 보면.
" 다른 제스처를 동시에 인식한다."라고 이해할 수 있죠?
이 값은 default가 false이지만, 다음처럼 우리가 true로 바꿔준다면, 동시에 여러 제스처를 인식할 수 있습니다!!
자 그럼 우리의 인식기가 저 delegate를 채택해줘야겠죠??
swipeLeft.delegate = self
tap.delegate = self
그럼 이제 swipe와 tap 모두 인식할거에요!!
자 다만... 저는 이 문제를 몇시간 동안 잡고 있었는데...
그 이유는 다름 아닌, 저 인식기를 View에 추가하는 방법에 문제가 있었습니다.
인식기를 추가하는 방법에는
infoView.addGestureRecognizer(tap)
이거 말고도
infoView.gestureRecognizers = [swipeLeft, tap]
요렇게 할 수도 있는데!
이렇게 하면 저 delegate 내부의 함수가 작동하지 않더라고요...
무조건 add gesture을 써주셔야 합니다!!
'iOS 개발 > UIKit' 카테고리의 다른 글
[UITextView] 줄 수, 글자 수 제한 (0) | 2021.11.22 |
---|---|
[UIView] 정말 예쁜 blur Effect (0) | 2021.11.21 |
[Swift] App 첫 로딩을 감지하는 법 (first loading detection) (0) | 2021.11.20 |
[Swift] 앱 안에서 메일 보내기 (0) | 2021.11.20 |
[UICollectionView] View를 하나씩 넘기기, 여러개씩 넘기기 (0) | 2021.11.17 |
[UIImageView] image 색 변경하기 (0) | 2021.11.09 |
[UITableVIew] automaticDimension 이 되지 않을때 (0) | 2021.10.18 |
[UIView] view를 fade in, fade out 시키는 방법 (0) | 2021.09.21 |