iOS

[iOS] cancelsTouchesInView 공식문서 & 예시

Kim_Baechu 2022. 8. 18. 14:12

 

https://developer.apple.com/documentation/uikit/uigesturerecognizer/1624218-cancelstouchesinview

cancelsTouchesInView

제스처가 인식됐을 때 뷰에 터치를 전달해 줄 것인가에 대한 Bool 값

 

이 값이 true(defalut)이고 리시버가 제스처를 인식하면, 제스처의 터치는 뷰에 전달되지 않고, touchesCancelled(_:with:)message가 뷰에 전달되고 이미 전달된 터치도 캔슬됩니다.

만약에 gesture recognizer가 제스처를 인식하지 못하거나, 이 값이 false이면 뷰는 모든 터치를 전달받습니다.

 

예시

여기 노란색뷰는 collectionView입니다.

collectionView의 cell은 회색입니다.

 

cell은 터치이벤트를 처리할 수 있습니다.

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    print(indexPath.item)
}

cell에 파란뷰를 넣고 파란뷰에 제스처를 추가했습니다.

let tap = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture))
blueView.addGestureRecognizer(tap)

...

@objc func handleTapGesture(_ sender: UIGestureRecognizer) {
    print(#function, sender.state.description)
}

여기서 회색뷰를 탭하면 다음과 같이 프린트됩니다.

0

 

여기서 파란뷰를 탭하면 다음과 같이 프린트됩니다.

handleInnerTapGesture(_:) ended

 

만약에 여기서 두손가락 탭하면 제스처가 인식되지 않았기 때문에 인덱스만 프린트됩니다.

0

 

 

 

코드를 다음과 같이 추가해줍니다.

tap.cancelsTouchesInView = false

 

그리고 탭하면 다음과 같이 프린트됩니다.

handleInnerTapGesture(_:) ended

0

 

만약에 여기서 두손가락 탭하면 제스처가 인식되지 않았기 때문에 인덱스만 프린트됩니다.

0