2012-01-18 7 views
22

UIViewUITapGestureRecognizer을 추가했습니다. 그보기 안에는 기본적으로 어떤 종류의 서브 뷰도 있습니다. UITableView. 문제는 UITableView이 행의 탭을 인식하지 못하는 이유는 무엇보다 탭 제스처 인식기의 처리기로 항상 이동한다는 것입니다. 왜 이것이, 어떻게 해결할 수 있습니까? 탭 수를 2로 설정하면 정상적으로 작동합니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 기본적으로 didSelectRowAtIndexPath을 호출하지 않습니다.UIView 및 UITableView의 UITapGestureRecognizer가 충돌합니다

답변

54

인식 자의 cancelsTouchesInViewNO으로 설정하십시오. 그렇지 않으면 터치 자체를 "소비"하고 테이블보기로 전달하지 않습니다. 그래서 선택 이벤트가 발생하지 않습니다. 당신이 원하는 경우

+4

[이 값을 '아니오'로 설정하면 인식기가 시퀀스를 인식하더라도 모든 참조를 기본보기로 전달하도록 지시합니다.] (http://developer.apple.com/library/IOs/#documentation/ UIKit/Reference/UIGestureRecognizer_Class/Reference/Reference.html) – dasblinkenlight

+1

예제 코드 'longPressGestureRecognizer.cancelsTouchesInView = NO;' (감사합니다 dasblinkenlight) – tmr

+0

@ dasblinkenlight 여전히 날 위해, 내 테이블보기 셀에 터치 이벤트를 수행 할 수 없습니다, 나는 테이블보기 셀에서 항목을 선택할 수 없습니다, 나는 'func tableView (_ table3 : TableView : UITableView, didSelectRowAt indexPath : IndexPath)'항목이 선택되지 않았다. –

26

모두 당신의 UITableViewUITapGestureRecognizer 터치 이벤트를 수신 한 다음 예 cancelsTouchesInView = NO 작동합니다. 탭 제스쳐 인식기가 테이블보기를위한 터치 이벤트를 수신하지 않도록하려면 다소 쉽지는 않지만 매우 능숙합니다.

기본적으로 제스처 인식기를 만들 때 자체를 위임자로 설정합니다. 그런 다음 gestureRecognizer:shouldReceiveTouch: 대리자 메서드를 구현합니다. 기본 구현은 다음과 같을 수 있습니다. 이 터치의 위치가 tableView의 관할권 내에서 떨어지면 본질적

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ 
    UITableView *tableView = self.tableView; 
    CGPoint touchPoint = [touch locationInView:tableView]; 
    return ![tableView hitTest:touchPoint withEvent:nil]; 
} 

(구현 된)이 방법은 tableView 요청하고 그 못하면 tableView 허용 ... 터치를 수신 제스처 인식기 차단 터치를받을 수 있습니다.

+1

3 행과 4 행을 변경하여 다음과 같이 간단하게 만들 수는 없겠지만 : CGRect frame = self.tableView.frame; 리턴! CGRectContainsPoint (프레임, 위치); – Aufwind

+0

@Aufwind 지나치게 복잡한 계산 코드를 지적 해 주셔서 감사합니다. 나는이 대답을 너무 많이 돌았어야합니다. 'CGRectContainsPoint()'는 당연히이 계산을 처리 할 수있는 훨씬 좋은 방법입니다. 그러나 나는'hitTest : withEvent :'를 사용하기 위해 나의 대답을 편집했다. 몇 가지 이유로 내가 선호하는 방법이 될 것입니다. 그 중 하나가 불규칙한 모양을 보입니다. 뷰가 불규칙한 모양으로 표시되는 경우 (예 : 원 안에있는 부분 만 터치 한 원) 이 경우는 내가 수행했던 수동 계산에 의해 적절히 처리되지 않습니다. 다시 한번 감사드립니다. – NJones

+0

반갑습니다. :-) – Aufwind

관련 문제