싱글탭 제스쳐와 더블탭 제스쳐 동시에 사용하는 법

SteadySlower·2022년 7월 14일
0

구현할 기능

오늘 구현하고자 하는 기능은 WordCell을 탭하면 단어의 뜻 → 히라가나 (혹은 히라가나 → 뜻)이 전환되고 더블탭을 하면 단어의 Success / Failure 여부를 초기화하는 기능입니다. (이미 외운 단어는 Success(초록색)으로 표시하고 아직 못 외운 단어는 Failture(노란색)으로 표시하는 기능을 이미 구현한 상황입니다.)

구현

더블탭 먼저!

탭 제스쳐와 더블 탭 제스쳐를 선언할 때는 탭 제스쳐를 위에 등록해야 합니다.

SwiftUI는 먼저 선언한 순서대로 제스쳐를 인식합니다. 즉 Cell을 탭하면 먼저 더블탭인지 판단하고 아니라면 나중에 등록한 탭 제스쳐인지 판단합니다.

즉 탭을 1회하면 탭 1회가 추가적으로 진행이 되는지 기다렸다가 탭이 없으면 싱글탭에 정의된 코드를 실행합니다.

WordCell()
	.gesture(TapGesture(count: 2).onEnded {
	    viewModel.updateToUndefined() //👉 Pass / Fail 초기화
	})
	.gesture(TapGesture().onEnded {
	    isFront.toggle() //👉 뜻 -> 히라가나 (혹은 히라가나 -> 뜻) 전환
	})

simultaneousGesture란?

구글링을 하다가 더블탭과 탭을 구현할 때는 아래와 같이 코드를 짜는 것이 좋다는 의견이 있었습니다.

simultaneousGesture로 선언한 제스쳐는 먼저 선언된 제스쳐와 동시에 해당 제스쳐를 인식하게 됩니다. 즉 탭을 1회 하더라도 더블탭인지 판단하기 위해서 기다리지 않고 바로 탭 제스쳐를 실행한다는 의미입니다.

WordCell()
	.gesture(TapGesture(count: 2).onEnded {
	    viewModel.updateToUndefined() //👉 Pass / Fail 초기화
	})
	.simultaneousGesture(TapGesture().onEnded {
	    isFront.toggle() //👉 뜻 -> 히라가나 (혹은 히라가나 -> 뜻) 전환
	})

simultaneousGesture로 선언했을 때 장점

아래 캡쳐는 각각 simultaneousGesture로 더블탭을 선언하지 않은 Text와 simultaneousGesture로 선언한 Text의 비교입니다. simultaneousGesture가 아닌 쪽은 탭 했을 때 약간의 딜레이가 있는 한편 simultaneousGesture로 선언한 쪽은 바로 탭 제스쳐가 인식되는 것을 볼 수 있습니다.

simultaneousGesture로 선언했을 때 단점

딜레이가 짧아지는 단점이 있지만 이런 방식으로 선언을 했을 때 치명적인 단점이 있습니다. 바로 더블 탭을 했을 때도 싱글 탭을 1번 인식한다는 점입니다. 아래 캡쳐를 보면 더블탭을 했음에도 불구하고 싱글탭의 동작까지 같이 수행하는 것을 볼 수 있습니다.

사용자는 분명히 Success / Failure의 초기화만 하고자 했음에도 한글 → 가나로 변경까지 되는 것을 볼 수 있습니다.

결론적으로 약간의 딜레이가 존재하더라도 simultaneousGesture 없이 선언하는 것이 우리가 구현하고자 하는 기능에 더 부합합니다.

profile
백과사전 보다 항해일지(혹은 표류일지)를 지향합니다.

0개의 댓글