UIScrollView
, 자식이 UIView
입니다. 나는 앞서 갔다 그래서 같은 아이 뷰에 UITapGestureRecognizer
를 추가했습니다 :UIScrollView 터치 다운이 하위 뷰로 처리되었습니다.
// in child
- (void)setup
{
[self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]];
}
// 및 핸들러
- (void)handleSingleTap:(UITapGestureRecognizer*)sender
{
if (sender.state == UIGestureRecognizerStateEnded)
NSLog(@"tap ended"); // this gets called
else if (sender.state == UIGestureRecognizerStateBegan)
NSLog(@"tap began"); // never get's called
}
이 코드는 뷰 컨트롤러에있을 수 있습니다하지만 난을 처리 할 이유가 보기 자체를 터치하십시오.
자세히 알 수 있듯이 탭 상태를 테스트하고 있습니다. 그러나 호출되는 유일한 상태는 사용자가 화면에서 손가락을 떼어 탭을 완료 할 때입니다. 즉, UIGestureRecognizerStateEnded입니다.
사용자가 scrollView 내에서 하위보기를 탭하면 부모 스크롤보기가 '가로 채기'가 모두 터치되는지 파악하고 관련성이 있는지 (이동, 확대/축소, 기타 등) 결정합니다. 그렇지 않은 경우 터치를 서브 뷰로 전달합니다. 그러므로 touchesBegan:withEvent:
은 scrollview의 서브 뷰에서 호출되지 않습니다.
사용자가 팬, 스크롤 또는 탭 여부에 관계없이 자식보기 내에서 터치 다운 이벤트 (즉, 사용자가 화면에 손가락을 놓는 순간)를 감지하는 것이 무엇이겠습니까? 아이 안에서 그 탭을 처리하십시오. scrollview의 동작은 변경되지 않아야합니다.
아마도 hitTest:withEvent
을 무시하는 등의 제스처 인식기가 더 나은 접근 방식이지만 내 조심성있는 인간의 두뇌는 그것을 파악하지 못하는 것 같습니다!
업데이트/예 : UITableView
은 셀이 들어있는 스크롤보기입니다. 셀에 손가락을 대면 즉시 강조 표시됩니다. 그런 다음 스크롤하는 행위는 탭을 '취소합니다'. 그것은 일반적으로 아이디어입니다.