7

작업

UICollectionView에 단일 탭 제스처를 추가 할 때 셀을 선택하지 마십시오.셀 선택을 유지하면서 탭 제스처를 UICollectionView에 추가하는 방법은 무엇입니까?

collectionView의 no-cell 부분에 다른 탭이 필요합니다. XCode8를 사용

코드

, 스위프트 3.

override func viewDidLoad() { 
    ... 
    collectionView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap))) 
} 

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

func tap(sender: UITapGestureRecognizer){ 
    print("tapped") 
} 

이 그래, 이제 방해가 결과. 셀을 탭하면 탭핑됩니다.

  • 분석 나는 collectionView 셀의 그러나 hitTest 반환 값을 확인합니다. > CollectionView

  • 3 개 제스처 collectionView에 셀에 아무런 제스처, 아무도 선택 셀에서 작동하도록 보인다
    • UIScrollViewDelayedTouchesBeganGestureRecognizer
    • - 모두가 셀의 응답자 체인을 형성 의미 탭 셀을 반환
    • UIScrollViewPanGestureRecognizer
    • UITapGestureRecognizer
  • 호출 스택, 셀 선택이 diffe을 것 같다 제스쳐의 목표 - 행동 패턴으로 스택 추적을 빌려주십시오.
  • 두 번 탭 동작이 셀 선택과 함께 작동합니다.

질문은

더 추적을 찾을 수 없습니다. 셀 선택을 구현하는 방법이나이 작업을 수행하기위한 아이디어? 대신 그냥 indexPath를 얻을 수 및/또는 이러한 방법으로 셀 수 didSelectItem을 강제로 시도

답변

15

을하지만, 대상보기에서 접촉을 도둑질하지, 당신 gestureRecognizer 인스턴스의 경우 UIGestureRecognizer.cancelsTouchesInView을 false로 설정해야합니다.

+0

감사합니다. 기본 문서로 다시 돌아가서 내가 놓친 것을 찾으려고 노력합니다! – jchnxu

5

: 당신이 제스처 인식기를 추가 할 때마다

func tap(sender: UITapGestureRecognizer){ 

    if let indexPath = self.collectionView?.indexPathForItem(at: sender.location(in: self.collectionView)) { 
     let cell = self.collectionView?.cellForItem(at: indexPath) 
     print("you can do something with the cell or index path here") 
    } else { 
     print("collection view was tapped") 
    } 
} 
+0

감사! 이것은 정말로 도움이됩니다. collectionView에 제스처를 더 추가 할 것이다. UICollectionView가 높은 수준의 제스처 인식기를 사용하는 대신 원시 터치를 분석하는 것처럼 보입니다. 이는 제한적입니다. – jchnxu