版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.06.02 |
前言
一般我们用的app很多都有手势操作,特别是点击手势,很多时候我们有个需求:就是要父视图响应点击手势,但是要求某个子视图不响应点击手势。感兴趣的可以看看我写的其他小技巧
1. 实用小技巧(一):UIScrollView中上下左右滚动方向的判断
2. 实用小技巧(二):屏幕横竖屏的判断和相关逻辑
详情
下面我就以一个demo来说明这种情况的解决方法。
一、解决方案
在手势的代理方法中,判断event的view,如果是要屏蔽的子视图就返回NO,其他就返回YES,这样子就实现了父视图响应手势,但是某个子视图不响应手势,也就是说子视图被屏蔽了。
二、代码实现
下面我们就直接看代码。
JJTapGestureVC.m
#import "JJTapGestureVC.h"
@interface JJTapGestureVC () <UIGestureRecognizerDelegate>
@property (nonatomic, strong) UIView *childView;
@property (nonatomic, strong) UITapGestureRecognizer *tapGesture;
@end
@implementation JJTapGestureVC
#pragma mark - Override Base Function
- (void)viewDidLoad
{
[super viewDidLoad];
[self setupUI];
}
#pragma mark - Object Private Function
- (void)setupUI
{
self.view.backgroundColor = [UIColor lightGrayColor];
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureDidTapped)];
tapGesture.delegate = self;
self.tapGesture = tapGesture;
[self.view addGestureRecognizer:tapGesture];
UIView *childView = [[UIView alloc] initWithFrame:CGRectMake(50, 200, 200, 200)];
[self.view addSubview:childView];
childView.backgroundColor = [UIColor blueColor];
self.childView = childView;
}
#pragma mark - Action && Notification
- (void)tapGestureDidTapped
{
NSLog(@"我是父视图");
}
#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([touch.view isDescendantOfView:self.childView]) {
return NO;
}
return YES;
}
@end
下面看结果gif
实现结果
结论:从上可以看出来,当我们点击父视图的时候会输出:我是父视图。但是点击蓝色的子视图,就没有输出了,也就是说子视图屏蔽了手势。
后记
上面又是一个实用小技巧,后面我还会持续更新,希望大家喜欢,待续哦~~~
风景