私のiPhoneアプリには、1つのメッセージ画面があります。に追加UITapGestureRecognizer
しました。また、画面にUIViewController
もがあります。UITableview
選択したいのですが、が原因でUITableViewCell
選択できません。画面をタッチすると、タップジェスチャアクションのみが呼び出され、デリゲートは呼び出されません。誰かが私がタップジェスチャーとの両方に取り組むのを手伝ってくれませんか。前もって感謝します。UITableView
UITapGestureRecognizer
UITableView
didSelectRowAtIndexPath:
UITableView:didSelectRowAtIndexPath:
4 に答える
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つのアプローチ(個別のビューまたはカスタムジェスチャレコグナイザー)を使用すると、完全なテーブルビュー機能を保持できますが、これは、単純なものが必要で、テーブルビューの残りの組み込み機能が必要ない場合に機能します。
テーブルビュー以外の場所でタップ ジェスチャを機能させたい場合は、タップ ジェスチャ認識エンジンをサブクラス化して、 の配列に含まれるサブビューを無視する認識エンジンを作成し、それらが成功したジェスチャを生成しないようにすることができます (したがって、または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];
TagGesture デリゲートを使用できます。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([touch.view isDescendantOfView:yourTableView]) {
return NO;
}
return YES;
}
お役に立てれば。
これを行う簡単な方法は、2 つのビューを用意することです。1 つはタップ ジェスチャをオンにするビューを含み、もう 1 つはテーブルビューを含みます。UITapGestureRecognizer を動作させたいビューにアタッチすると、UITableView がブロックされなくなります。