2

내 iPhone 앱에는 메시징 화면이 하나 있습니다. UIViewControllerUITapGestureRecognizer을 추가했으며 화면에 UITableview이 있습니다. UITableViewCell을 선택하고 싶지만 UITapGestureRecognizer 때문에 UITableView을 선택할 수 없습니다. 화면을 터치하면 탭 제스처 동작 만 호출되지만 UITableView 델리게이트 didSelectRowAtIndexPath:은 호출되지 않습니다. 누구든지 탭 제스처와 UITableView:didSelectRowAtIndexPath: 모두에서 작업하도록 도와주세요. 미리 감사드립니다. 이 도움이UITableView 아이폰에서 UITableView IndexPath를 얻는 방법은 무엇입니까?

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view isDescendantOfView:yourTableView]) { 
     return NO; 
    } 

    return YES; 
} 

희망 :

+0

tableview는 화면에서 유일한보기입니까, 아니면 계층 구조의 일부입니까? –

+0

답변 해 주셔서 감사합니다. 아니요, tableview 및 UIToolbar가 화면의 subView입니다. – Gopinath

+3

어떻게 작동합니까? tapgesturerecognizer는 언제해야합니까? –

답변

6

내가 매트를 선호하는 동안 :

#import <UIKit/UIGestureRecognizerSubclass.h> 

@interface MyTapGestureRecognizer : UITapGestureRecognizer 
@property (nonatomic, strong) NSMutableArray *excludedViews; 
@end 

@implementation MyTapGestureRecognizer 

@synthesize excludedViews = _excludedViews; 

- (id)initWithTarget:(id)target action:(SEL)action 
{ 
    self = [super initWithTarget:target action:action]; 
    if (self) 
    { 
     _excludedViews = [[NSMutableArray alloc] init]; 
    } 

    return self; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesBegan:touches withEvent:event]; 

    CGPoint location = [[touches anyObject] locationInView:self.view]; 

    for (UIView *excludedView in self.excludedViews) 
    { 
     CGRect frame = [self.view convertRect:excludedView.frame fromView:excludedView.superview]; 

     if (CGRectContainsPoint(frame, location)) 
      self.state = UIGestureRecognizerStateFailed; 
    } 
} 

@end 

와 다음, 당신이 그것을 사용할 때, 당신이 제외 할 내용을 제어 지정 Meyer의 제안이나 커스텀 제스처 인식기를 사용하는 또 다른 제안인데, 맞춤식 제스처 인식기를 사용하지 않는 또 다른 해결책은 탭 제스처 인식기가 테이블 뷰의 셀을 탭했는지 여부를 확인하는 것입니다. 그렇다면 수동으로 didSelectRowAtIndexPath을 호출하십시오. :

테이블 뷰와 관련하여 정교한 작업을 수행하는 경우 (예 : 셀 편집, 사용자 정의 컨트롤 등)을 사용하면 해당 동작을 잃지 만, 단지 didSelectRowAtIndexPath을 수신하려는 경우이 작업이 필요할 수 있습니다. 다른 두 가지 접근법 (개별 뷰 또는 사용자 정의 제스처 인식기)을 사용하면 전체 테이블 뷰 기능을 유지할 수 있지만 단순한 무언가가 필요하고 나머지 테이블 뷰의 기본 제공 기능이 필요하지 않은 경우이 기능이 작동합니다.

0

당신은 TagGesture 대리자를 사용할 수 있습니다.

+1

'touch.view'가'UIViewController'에 있다면 제대로 작동 할 지 모르겠습니다. 그러나 나는 그 생각이 옳다고 생각합니다 : 꼭지점 위치를보고 tableview의 틀과 비교하여 CGPoint location = [gestureRecognizer locationInView : self.view];를 얻은 다음'if (CGRectContainsPoint (self.tableView.frame, location)) ... ' – Rob

+0

@Rob 좀 더 살펴 보겠습니다. 귀하의 정보를 가져 주셔서 감사합니다. – NSPunk

0

더 쉬운 방법은 탭 제스처를 수행 할보기가 포함 된보기와 tableview를 포함하는보기의 두 가지보기를 만드는 것입니다. UITapGestureRecognizer를 작업하고자하는 뷰에 첨부하면 UITableView가 차단되지 않습니다.

0

탭 동작을 제외한 모든 곳에서 탭 동작이 작동하도록하려면 excludedViews 배열에 포함 된 하위 뷰를 무시하는 인식자를 생성하여 탭 제스처 인식기를 서브 클래스 화하여 성공적인 제스처를 생성하지 못하게 할 수 있습니다) didSelectRowAtIndexPath에 전달하기이든 :

MyTapGestureRecognizer *tap = [[MyTapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
[tap.excludedViews addObject:self.tableView]; 
[self.view addGestureRecognizer:tap]; 
관련 문제