实用小技巧(三):点击手势屏蔽子视图的响应

版本记录

版本号 时间
V1.0 2017.06.02

前言

一般我们用的app很多都有手势操作,特别是点击手势,很多时候我们有个需求:就是要父视图响应点击手势,但是要求某个子视图不响应点击手势。感兴趣的可以看看我写的其他小技巧
1. 实用小技巧(一):UIScrollView中上下左右滚动方向的判断

2. 实用小技巧(二):屏幕横竖屏的判断和相关逻辑

详情

下面我就以一个demo来说明这种情况的解决方法。

一、解决方案

在手势的代理方法中,判断event的view,如果是要屏蔽的子视图就返回NO,其他就返回YES,这样子就实现了父视图响应手势,但是某个子视图不响应手势,也就是说子视图被屏蔽了。

二、代码实现

下面我们就直接看代码。

JJTapGestureVC.m
#import "JJTapGestureVC.h"

@interface JJTapGestureVC () 

@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

实用小技巧(三):点击手势屏蔽子视图的响应_第1张图片
实现结果

结论:从上可以看出来,当我们点击父视图的时候会输出:我是父视图。但是点击蓝色的子视图,就没有输出了,也就是说子视图屏蔽了手势。

后记

上面又是一个实用小技巧,后面我还会持续更新,希望大家喜欢,待续哦~~~

实用小技巧(三):点击手势屏蔽子视图的响应_第2张图片
风景

你可能感兴趣的:(实用小技巧(三):点击手势屏蔽子视图的响应)