UIScrollView与之子View的触摸事件

1、问题:

在一个UIScrollView上存在子View,该子View完全填充其父View(UIScrollView),此时,我需要一个触摸或者点击的事件,将子View移除,刚入坑IOS的我,绕了一大圈。

2、解决办法

刚开始,直接在子View上加上了三个UIGestureRecognizer,分别对应点击事件,上划和下划,测试的时候,点击事件的响应没有问题,但是上下划,全被父视图(UIScrollView)拿走了,经过一番资料查找和测试,发现了两种解决方法,如下:

a.比较简单的处理(后知后觉发现的)

在UIView中有一个方法,如下

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if (self.exceptView) {
        if ([self.exceptView pointInside:[gestureRecognizer locationInView:self.exceptView] withEvent:nil]) {
            return NO;
        }
    }
    return YES;
}

这个方法就是通过返回值来判断当前手势识别是成功还是失败,所以,在父View中重写这个方法,当发生触摸的点是在子View中的时候,返回NO,此时,父View不会响应手势事件,所以事件自然而然走到了子View,子View便可以直接响应;

b.这个是我开始使用的比较复杂一点的方法

在UIScrollView中,有这么一个属性:canCancelContentTouches,默认值应该是false,他的意思是当前的ScrollView是否可以取消Touch事件,在参考了诸多博文中,将此变量的值设为YES,然后重写另一个方法:

- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
    return YES;
}

此方法也是UIView中的方法,默认返回YES,如果返回NO的话,也不会响应触摸事件,所以根据子View 的可见与否或者其他条件,返回NO,此时,事件也会传到子View 中,但是这个时候,子View不是通过添加手势来响应,而是需要重写Touch系列的方法:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self closeGuide];
}

没有复杂的逻辑的话,重写这一个就够用(我的场景一个就够用了)。如果不重写上面那个函数,其实事件也可以传递过来,但是父View和子View的TouchesBegan都会被调用,原因我还不是很清楚,希望有大神看到,劳烦指导一下。

在实现逻辑之后,当然还需要将父View的状态恢复,不影响其原本逻辑;

其实实现的方式太多,只是本人比较轴,希望趁着这个时候了解一下OC的事件传递,所以才非要在事件的处理过程中来做。

记录此坑,虽然是自坑;

下面贴上一个链接,介绍ios的事件传递,以做参考和学习:

IOS事件传递

希望与大家共勉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值