2010-03-30 3 views
3

iPhone에서 간단한 게임을 개발 중이며 UIViewController을 통해 UIViewUIView 및 일부 UIImageView이 포함 된 사용자 정의를로드 중입니다. UIImageView 일부에서 터치 이벤트를 감지하고 싶지만 지금까지는 수행 할 수 없었습니다.UIView의 깊은 계층 구조 내에서 UIImageView에서 터치 이벤트를 감지하는 방법은 무엇입니까?

내가 테스트 목적으로 두 번째 프로젝트를 생성 UIImageView의 핸들 터치 이벤트 계층 구조가 같은 경우 것으로 생각했습니다

UIViewController ->UIView ->UIImageView,

하지만 때 이 같은입니다 :

UIViewController ->UIView - >UIView ->UIImageView

그들은 감지되지 않습니다.

참고 :
- 내가 위에서 언급 모든 UIViewsUIImageViews 사용자 정의 서브 클래스 - userInteractionEnabled 모든 경우
YES입니다.

사용자 정의 UIImageView이보기 계층에서 더 깊어지면 어떤 이유로 터치 이벤트를 수신 할 수 없는지 생각할 수 있습니까?

답변

4

터치는 목적지까지 길고 간헐적 인 경로를 취합니다. 공식적으로 그들은 응답자 체인을 올라가며 첫 번째 응답자에서 시작하여 가장 깊은 터치보기부터 해당보기 컨트롤러, 다음 터치 식보기 등으로 이동합니다.

실제 그림은 훨씬 더 복잡합니다. 가장 깊은 터치를 포함한보기를 포함하여 터치는 본질적으로 hitTest:withEvent: 메서드를 호출하여 해당 정보의 최상위보기를 "묻습니다". 이것은 일부 슈퍼 뷰가 터치를 하이재킹 할 수있게 해줍니다. 서브 뷰가 무슨 일이 일어나기 전에 가끔은 (스크롤/줌) 작업을하는 UIScrollView처럼 매우 유용 할 수 있습니다. 여기

를 결정하는 데 도움이되는 몇 가지 도움말입니다 왜보기는 터치에 응답하지 않을 수 있습니다

  • 재정 [hitTest:withEvent:] 1 당신의 전망과 NSLog의 각 그들이 고려되고 누가 볼 치여 때 리스폰 더 체인.
  • recursiveDescription 문서화되지 않은 (따라서 제출하기 전에 제출할) UIView 메서드를 사용하면 런타임에 모든 뷰의 프레임을 확인할 수 있습니다. 뷰는 기본적으로 프레임 크기를 초과하여 표시되므로보기보다 논리적으로 작게 보이며 논리적 (비 시각적) 크기를 기준으로 반응합니다.
  • 이것은 바보 같지만 메서드가 찾고있는 출력에 올바르게 연결되었는지 다시 확인하십시오. 예를 들어 UIButton을 터치 할 때 - [MyClass buttonPressed] 메소드가 호출 될 것으로 예상되는 경우 MyClass 인스턴스와 @selector(buttonPressed)을 해당 버튼의 대상/액션 쌍으로 추가했는지 다시 확인하십시오.
  • 이러한 작업이 없으면 touchesBegan:withEvent:NSLog 메시지로 대체하여 터치가 응답 체인의 어디로 올라가고 있는지 확인하십시오.

그리고 이미 알고 계시 겠지만, userInteractionEnabled 국기에주의하십시오!

문제를 해결하기에 충분합니다.

+2

먼저 빠른 응답에 감사드립니다. 방금 ​​팁을 살펴 보았습니다. 문제는 UIImageView를'initWithFrame'으로 초기화하지 않았다는 것입니다. 두 번째 팁은 이것이 문제라고 의심하게 만들었습니다. "기본적으로보기가 프레임 크기를 초과하여 표시되므로보기보다 논리적으로 크기가 작지만 시각적으로 볼 때 논리적으로 크기가 작습니다. 시각적) 크기. " – jester

관련 문제