UITapGestureRecognizerを加えたViewのsubviewsに対するタップジェスチャーを無効にする方法です。
viewAのsubviewsには、viewBとviewCが配置し、viewAにはUITapGestureRecognizerを加えています。
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewADidTap)];
[self.viewA addGestureRecognizer:tap];
上記の設定でviewAをタップすると- (void)viewADidTap
が呼ばれます。
viewB、viewCの領域内をタップした場合にも- (void)viewADidTap
が呼ばれます。
これをviewB、viewCの領域内をタップした時に- (void)viewADidTap
を呼ばないようにする方法です。
実装
ViewController.m
#import "ViewController.h"
@interface ViewController () <UIGestureRecognizerDelegate>
@property (weak, nonatomic) IBOutlet UIView *viewA;
@property (weak, nonatomic) IBOutlet UIView *viewB;
@property (weak, nonatomic) IBOutlet UIView *viewC;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewADidTap)];
tap.delegate = self;
[self.viewA addGestureRecognizer:tap];
}
/* タッチジェスチャーを発生させるかどうかを返す実装をする */
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
/* タッチイベントが発生したビューとviewB, viewCを比較する */
if (touch.view == self.viewB || touch.view == self.viewC) {
// viewB, viewCの場合ジェスチャーを許可しない
return NO;
}
return YES;
}
- (void)viewADidTap
{
NSLog(@"viewA");
}
@end