2012-12-07 2 views
0

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은 셀이 들어있는 스크롤보기입니다. 셀에 손가락을 대면 즉시 강조 표시됩니다. 그런 다음 스크롤하는 행위는 탭을 '취소합니다'. 그것은 일반적으로 아이디어입니다.

답변

0

제스처 인식기를 하위보기에 추가하면 스크롤보기가 표시되고 사용자가 스크롤하지 않을 것으로 판단한 후 전달하기로 결정한 이벤트가 표시됩니다. 필요에 맞으면 다음과 같이 쉽게 설정할 수 있습니다.

tableView.delaysContentTouches = NO; 

이렇게하면 터치 방식이 즉시 호출됩니다.

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScrollView_Class/Reference/UIScrollView.html

귀하의 다른 옵션은 스크롤 뷰 자체에 제스처를 수신 할 수 있으며, 사용은 사용자가 아이 뷰와 상호 작용하는 방법을 결정하기 위해 테스트를했다.