티스토리 뷰

반응형

안녕하세요 :) 오늘은 제스쳐에 대해서 알아볼거에요.


이 제스쳐가 무엇이냐..

제스쳐에는 여러가지가 있을 수 있어요. 


그냥 단순하게 화면을 터치할 수도 있고, 길게 누를수도 있고, 두손가락으로 확대할 수 도 있고, 화면도 넘길 수 있죠.

제스쳐로 이런 다양한 기능들을 할 수 있답니다 :)


오늘은 이 제스쳐를 어떻게 할건지 알아볼거에요XD


먼저 제스쳐를 구현하는 방법에는 두가지가 있어요.

1. touchesBegan/Ended/Moved/Cancelled


2. Tap Gesture Recognizer을 포함한 다양한 제스쳐



메인스토리보드에서 찾을 수 있죠XD?


오늘은 둘 다 배워보도록 할게요.

먼저 Xcode 프로젝트를 만들어주세요.



touchesBegan/Ended/Moved/Cancelled




얘네를 먼저 배워보도록 하겠습니다. 



●  touchesBegan

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        print("touchesBegan is called")

}


위의 메소드 이름만 봐도 아시겠죠? 터치가 시작될 때 불려지는 함수입니다. 

그냥 뷰컨트롤러 아무데나 선언해주세요.

진짜로 되는지 확인해봅시다. 



print문을 이용해서 확인해봤어요 :) 정말 화면을 누를때마다(클릭할때마다) 호출되더라구요.


●  touchesMoved

이제 moved메소드를 써볼까요? ㅎㅎ began처럼 이름만봐도..손가락을 움직이면 불릴것만 같은...메소드...


그냥 터치만 해도 moved가 호출되네요. 

그리고 정말 조금만 움직여도

이렇게나 많이 ㄷㄷ 호출되는 것을 볼 수 있습니다..


●  touchesEnded


moved는 보기 힘드실까봐 잠깐 주석처리했어요 :)

클릭을 딱 한번한 상태입니다.


began과 ended가 불리는 건 당연하겠죠?


cancelled는 언제 불리는지..제가 잘 모르겠어서..넘어가겠습니다.

별걸 다 해봤는데, cancelled는 안불리더라구요..ㅠㅠ 조금 더 알아보겠습니다!




Gesture Recognizer




한 번 같이 해봅시다. 우리는 gesture Recognizer중에서도 Tap gesture Recognizer를 사용해볼거에요.

스토리보드로 가주세요 :)

그리고 Tap Gesture Recognizer를 찾고, View에 추가해주세요 :)

Tap Gesture Recognizer의 이름에서 알 수 있듯이, Tap 제스쳐, 즉 화면을 한번 탁 탭하는 행동을 인식하는 애구나..라고 생각하시면돼요!


view에는 아무 변화가 없는 것 처럼 보이지만, 현재 뷰 전체에 Tap Gesture Recognizer가 적용된 상태랍니다. 

그리고, Tap Gesture Recognizer도 button, label과 마찬가지로 IBOulet과 IBAction이 존재합니다.

그럼 우리는 사용자가 화면을 탭 했을 때 무언가를 하고싶다!라고 하면, 어떤것을 추가해줘야할까요?



네. IBAction을 추가해줘야겠죠?

button, label의 IBAction만드는 방법과 동일합니다.




이렇게요!


이것도 한번 테스트해봅시다.



오.. 클릭할때마다 역시 불리게 되네요 :)


여기서 생긴 궁금증 ㅎㅎ

Q : touchesBegan과 Tap Gesture Recognizer를 같이 구현해놓으면, 어느게 먼저 불릴까?


한번 해봅시다.




몇번 눌러봤는데, 항상 touchesBegan이 먼저 불리는 것을 볼 수 있어요.
그리고 뭔가 Tap Gesture Recognizer는 딜레이가 정말 살짝 있는 느낌?
ㅎㅎ




그럼 이렇게 사용자의 화면 터치?에 대한 action이 필요할 때, 어느 방법을 쓰는게 좋을까요?
touchesBegan? Tap Gesture Recognizer?


음..찾아보니! 몇가지 사실을 알게되었습니다 XD

1. Gesture Recognizer(Tap, longPress..등등)는 올바른 제스처를 감지했다고 주장하기 위해 초기에 시간이 필요하다고 해요. 

만약에 제가 Tap Gesture Recognizer를 설정해놨다고 해봅시다.

그럼 iOS는 사용자가 스와이프를 하든, 화면을 길게 꾹 누르든지 할텐데, 이게 탭제스쳐인지 확인하는 시간이 필요해요.
(그래서 위에서 touchesBegan보다 늦게 호출된 것 같아요.) 

그리고, 개발자 문서를 보면 Tap Gesture Recognizer는 제스쳐를 인식하는 동안 touch객체의 전달을 지연시킬 수 있다고 해요. 
이게 무슨소리인가!!보면, 


touchesbegan은 화면을 클릭하자마자 호출되지만,

꾹! 누르고 있을 때는, Tap Gesture Recognizer가 바로 호출이 되지 않는 것, 보이세요?


그래서 제스쳐를 인식하는 동안 touch객체의 전달을 지연시킬 수 있다고 한 것 같아요.

그러면, 진짜 본론으로 돌아가서 둘중 어느것을 쓰는게 좋으냐?


이거에 대한 답은 정확히 찾을 수 없었지만, Gesture Recognizer를 사용하는게 조금 더 좋다고 하는 글이 있어요. 

제 생각에도 Gesture Recognizer가 더 좋다고 느껴지는게, touches~에는 began, moved, ended, cancelled만 있는 반면, Gesture Recognizer에는 스와이프나, long press같은 제스쳐들도 인식이 가능하니까, 조금 더 음..코딩이 쉬울 것 같은..?ㅎㅎ느낌이네요.


그냥 간단하게 제스쳐 인식하는거 글 쓴건데.. 꽤 오래걸린 글이네요 :0...

다음글에서 만나요 :)

도움이 되었으면 좋겠어요ㅎㅎ

항상 말씀드리지만, 궁금하신점이나 지적하실 부분이 있다면

언제든지!!! 댓글이나 PC화면에서 볼 수 있는 채널서비스를 이용해주세요 :)








반응형
댓글
  • 프로필사진 알 수 없는 사용자 작성된지 오래된 글이라서 cancelled가 언제 불리는지 이제는 아실지도 모르지만... 화면을 터치한채로 홈화면으로 빠져버리면 cancelled가 호출됩니다.
    아마 화면을 터치한채로 alert 창이 떠도 호출될거 같네요!
    2020.12.15 20:45
댓글쓰기 폼
반응형
Total
3,825,666
Today
1,099
Yesterday
2,840