터치 이벤트를 적절한 형제 UIView에 전달


12

UIView의 오버레이에서 touchesBegan으로 터치 이벤트를 처리하려고하고 있지만 터치 입력이 아래의 형제 UIView에 전달되도록 허용하려고합니다. 터치 이벤트를 처리 한 다음 "지금이 응답자가없는 것처럼 응답자에게 보냅니다"라고 말할 수있는 직접적인 방법이있을 것이라고 기대했지만, 찾을 수있는 것은 nextResponder 메서드입니다. 부모를 내 오버레이보기로 되돌립니다. 그 부모는 실제로 그 오버레이 뷰의 다음 형제에 전달하지 않습니다. 그래서 불확실한 방법을 수행하는 방법은 터치 콜백으로 수행되는 간단한 작업처럼 보이는 것입니다. True 또는 False 반환 값을 전달하면됩니다. 위젯 계층 구조를 계속 처리할지 여부.

나는 분명한 뭔가를 놓치고 있습니까?

3

늦게 대답하지만 touchesBegan 대신에 hitTest:withEvent:을 무시하는 것이 좋습니다. 제게는 touchesBegan이 단순한 일을 처리하는 꽤 "높은 수준"의 방법이라고 생각합니다. 따라서 이벤트가 더 전파되면 그 수준에서 변경할 수 없습니다. 그럴만한 곳은 hitTest:withEvent:입니다.

이 점에 대한 자세한 내용은 this S.O. answer을 참조하십시오.


1

당신이 찾고있는 원하는 동작을 이해했습니다. 형제보기로이 자동 메시징 업 체인 동작을 지원하는 API에서 뭔가를 찾지 못했습니다.

내가 원래 작성한 내용은 터치에 대해 부모 UIView에 알리는 것과 관련되어있었습니다. 이것은 여전히 ​​적용되지만 당신이 그것을 한 걸음 더 나아갈 필요가 있다고 생각하고 부모 UIView는 Sergio가 각각의 오버뷰에 대한 형제 인 하위 뷰에 대해 설명한 히트 테스트 기술을 사용하고 상위 UIView에서 수동으로 "do 무언가 "방법 각각의 히트 테스트를 통과 subviews. 이러한 형제 뷰 각각은 다른 형제에게 알리는 것을 중단할지 또는 체인을 계속할 지에 대한 BOOL 값을 반환 할 수 있습니다.

이 패턴을 많이 사용하는 경우 히트 테스트를 캡슐화하고보기를 요구하는 선택기를 수행하도록 UIView에 범주 메서드를 추가하는 것이 좋습니다.

매뉴얼 약간의 작업으로 내 원래의 대답

, 당신은 자신이 함께이 문제를 연결할 수 있습니다. 나는 이것을해야만했고, 나를 위해 일했다. 왜냐하면 나는 자주 사용되는 케이스 (버튼에 대한 오버레이 뷰)가 있었기 때문에 사용자 정의 클래스를 만드는 것이 합리적이었다. 상황이 비슷하다면,이 기술 중 하나가 충분할 것입니다. 옵션 1

: 오버레이가 아무것도 할 수 있지만, 꽤 볼 필요가없는 경우, 그것은 userInteractionEnabled = NO 완전히 처리 터치의 선택을 취소합니다. 이렇게하면 터치 이벤트가 부모 UIView (오버레이가되는 UIView)로 이동합니다.

옵션 2 : 오버레이를 가지고는 (기본값처럼) 터치 이벤트를 흡수하고 터치하거나 특정 제스처가 인식되었음을 나타내는 상위에 UIView의 메소드를 호출하고 여기에 그것이 무엇인지입니다. 이렇게하면 다른 누군가가 가로 채기를하더라도 여전히 오버레이 뒤의 UIView가 터치 인식에 작용합니다.

옵션 2는 UIControlEventTouchDownUIControlEventTouchUpInside과 같은 간단한 UIControlEvent 유형에 더 적합합니다.필자의 경우 (사용자 정의 오버레이 뷰가있는 사용자 정의 UIButton 하위 클래스), 터치하여 와이어를 연결하고 버튼의 이벤트를 두 개의 개별 메소드로 터치합니다. 버튼 아래에서 터치 다운 또는 내부 위로 터치 이벤트가 발생하면 이러한 이벤트가 발생합니다. 그러나 버튼을 눌렀 음을 시뮬레이션해야 할 경우 오버레이 뷰에서 호출 할 수있는 훅입니다.

사용자의 필요에 따라 오버레이와 부모 UIView 사이에 알려진 프로토콜을 사용하거나 respondsToSelector: 검사를 사용하여 UIView를 비공식적으로 테스트 할 수 있습니다. 호출하기 전에 원하는 사용자 정의 메서드로 performSelector:을 호출하십시오. UIView가 오버레이로 덮여 있지 않으면 자동으로 해고되었습니다.