2

몇 가지 제스처 인식기가 첨부 된 자체 전체 화면 콘텐츠보기를 관리하는 컨테이너보기 컨트롤러가 있습니다. 하위보기 컨트롤러는 화면의 일부에 오버레이 될 수 있습니다. 루트 뷰는 스택 뷰의 복잡한 뷰 계층을 포함하는 UIScrollView로 덮여있는 불투명 한 배경색을 제공하는 UIView입니다.자식보기 컨트롤러에서 처리되지 않은 터치 이벤트가 컨테이너보기로 전달되지 않도록 방지

아이의 스크롤링은 사용자 상호 작용뿐만 아니라 올바르게 작동합니다. 그것의 subviews와. 내가 겪고있는 문제는 스크롤 뷰 자체 (즉, 서브 뷰 내부가 아닌)의 탭 또는 기타 비 스크롤 동작이 빈 UIView를 통해 빠져 나오고 루트 뷰의 제스처 인식기가 예기치 않게 처리한다는 것입니다. 상위 (컨테이너) 컨트롤러의 나는 그 접촉을 무시하거나 취소하기 위해 그 아이의 배경을 삼켜 버리기를 원합니다.

첫 번째 생각은 터치 이벤트가 수퍼 뷰로 전달되는 것을 방지한다고 가정 할 때 자식 VC에서 nextResponder을 재정의하여 nil을 반환하는 것이 었습니다. 아무런 성공도 없었으므로 자식 컨트롤러에서 터치 처리 메서드 (touchesBegan: 등)를 재정의하려고했지만 결코 호출되지 않았습니다. 그런 다음 간단한 UIView 하위 클래스를 내 자식 컨트롤러의 루트보기로 대체했습니다. 마찬가지로이 두 가지 방법을 대신 사용하려고했습니다. nextResponder에 대해 nil을 다시 반환해도 아무 효과가 없으며 터치 메서드가 호출되지 않습니다.

내 응답기 체인은 스크롤 뷰 -> 자식 VC의 루트보기 -> 자식 VC -> 부모의 루트보기 -> 상위 VC로 정확하게 설정되어있는 것 같습니다. 그게 내 컨트롤러 봉쇄가 올바르게 설정되었다고 생각하게 만들고 부모의 루트보기에있는 제스처 인식기가 어떻게 든 이해하지 못하는 방식으로 응답 체인에서 우위를 차지하는 것으로 의심하게 만듭니다.

이것은 쉬운 것처럼 보입니다. 내가 뭘 놓치고 있니? 감사!

+0

당신의 물건의 그래픽 표현이 도움이 될 것입니다. 또는 프로젝트 데모 :) 또는 몇 줄의 코드 – Jageen

+0

자식 컨트롤러의 루트보기로 "대체 된"UIView가 true로 설정된 사용자 상호 작용을 사용하도록 설정했는지 확인하십시오 –

+0

Thanks @SandeepBhandari, I 바닐라 UIView를 사용할 때와 내 하위 클래스를 사용할 때 사용자 상호 작용이 활성화되었습니다. 나는 그것을 해제하는 것으로 실험했다. (체인을 감추는 것을 막기 위해 필요한 생각일지도 모르겠다.)하지만 그것은 모든 하위 뷰에 대한 사용자 상호 작용을 없앤다 (내 스크롤보기 등). – 4bar

답변

1

this very helpful WWDC video 덕분에 나는 더 잘 이해하고 있다고 생각합니다.

들어오는 터치가 주어지면, 시스템은 가장 먼저 적중 된 테스트 된보기와 그 터치를 연관시킵니다. 내 경우에는 그것이 UIScrollView입니다. 그런 다음 슈퍼 뷰의 계층 구조를 따라 올라가서 다른 인식기를 찾는다. 이 동작은 문서의이 키 비트에 의해 암시 :

제스처 인식은 터치 특정보기 그 뷰의 서브 뷰의 모든 충돌 테스트에서 작동합니다.

스크롤보기에는 인식 할 수없는 터치를 취소하거나 응답 체인에 전달되지 않는 응답기 방법으로 폴백 할 수있는 자체 내부 팬 인식자가 있습니다. 내 인식기가 비활성화 된 경우에도 내 응답자 메서드가 호출되지 않는 이유를 설명합니다. 이 정보

무장, 나는 같은 내 문제를 해결하기 위해 몇 가지 방법, 생각할 수 : 접촉을 무시하는

  • 사용 제스처 대리자 메서드/경우 관련 뷰가 아이 컨트롤러 중일 때.
  • 모든 터치를 캡처하고 무시한 "null"제스처 인식기 하위 클래스를 작성하고이를 하위 컨트롤러의 루트보기에 연결합니다.

하지만 내가 한 일은 상위 뷰에 새로운 빈 뷰가있는 뷰 계층 구조를 재배치하여 자식 뷰가 서브 뷰가 아닌 기본 컨텐츠 뷰의 형제가 될 수 있도록하는 것입니다.

그래서 뷰 ​​계층이 변경 사항 :

"Before" hierarchy

이에 : 이것은 내 문제를 해결

"After" hierarchy

: 내 제스처 인식기가 더 이상 저리가이다 접촉과 상호 작용하지 자식 컨트롤러의 관점에서 테스트되었습니다. 그리고 나는 추가 로직을 필요로하지 않고 내 앱 컨트롤러 간의 개념적 관계를 더 잘 포착 할 수 있다고 생각한다.