2

私のiPhoneアプリには、1つのメッセージ画面があります。に追加UITapGestureRecognizerしました。また、画面にUIViewControllerもがあります。UITableview選択したいのですが、が原因でUITableViewCell選択できません。画面をタッチすると、タップジェスチャアクションのみが呼び出され、デリゲートは呼び出されません。誰かが私がタップジェスチャーとの両方に取り組むのを手伝ってくれませんか。前もって感謝します。UITableViewUITapGestureRecognizerUITableViewdidSelectRowAtIndexPath:UITableView:didSelectRowAtIndexPath:

4

4 に答える 4

6

Matt Meyerの提案またはカスタムジェスチャレコグナイザーを使用する他の提案が好きですが、カスタムジェスチャレコグナイザーを含まない別の解決策は、テーブルビューのセルをタップしたかどうかをタップジェスチャレコグナイザーに識別させることです。呼び出すdidSelectRowAtIndexPath、例:

- (void)handleTap:(UITapGestureRecognizer *)sender
{
    CGPoint location = [sender locationInView:self.view];

    if (CGRectContainsPoint([self.view convertRect:self.tableView.frame fromView:self.tableView.superview], location))
    {
        CGPoint locationInTableview = [self.tableView convertPoint:location fromView:self.view];
        NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:locationInTableview];
        if (indexPath)
            [self tableView:self.tableView didSelectRowAtIndexPath:indexPath];

        return;
    }

    // otherwise proceed with the rest of your tap handling logic
}

これは最適ではありません。テーブルビューで高度な操作を行っている場合(セル編集、カスタムコントロールなど)、その動作は失われますが、を受け取りたいだけの場合は、didSelectRowAtIndexPathこれでうまくいく可能性があります。他の2つのアプローチ(個別のビューまたはカスタムジェスチャレコグナイザー)を使用すると、完全なテーブルビュー機能を保持できますが、これは、単純なものが必要で、テーブルビューの残りの組み込み機能が必要ない場合に機能します。

于 2012-08-13T15:18:09.403 に答える
0

テーブルビュー以外の場所でタップ ジェスチャを機能させたい場合は、タップ ジェスチャ認識エンジンをサブクラス化して、 の配列に含まれるサブビューを無視する認識エンジンを作成し、それらが成功したジェスチャを生成しないようにすることができます (したがって、またはexcludedViewsに渡します)。didSelectRowAtIndexPathなんでもいい):

#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

そして、それを使用したい場合は、除外したいコントロールを指定するだけです:

MyTapGestureRecognizer *tap = [[MyTapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[tap.excludedViews addObject:self.tableView];
[self.view addGestureRecognizer:tap];
于 2012-08-13T14:12:57.917 に答える
0

TagGesture デリゲートを使用できます。

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

    return YES;
}

お役に立てれば。

于 2012-08-13T13:46:28.503 に答える
0

これを行う簡単な方法は、2 つのビューを用意することです。1 つはタップ ジェスチャをオンにするビューを含み、もう 1 つはテーブルビューを含みます。UITapGestureRecognizer を動作させたいビューにアタッチすると、UITableView がブロックされなくなります。

于 2012-08-13T13:59:55.843 に答える