ios 手势点击子视图的时候不响应父视图的点击事件

本文介绍了一种简单的方法来避免子视图的点击事件干扰到父视图的正常响应。通过判断点击位置是否在背景视图(_BGView)内,可以有效地控制点击事件的传递。

这里写图片描述

手势点击子视图的时候不响应父视图的点击事件;

一句代码搞定:

if( CGRectContainsPoint(_BGView.frame, [sender locationInView:_TableBGView])) {
    }else{
        [_BGView removeFromSuperview];
    };
### 关于 `NULL` 的本质 在 C 语言中,`NULL` 是一个宏定义,其核心意义是用来表示空指针。它的值本质上是一个特殊的零值,即 `(void*)0` 或者单纯的 `0`,这取决于具体的实现环境以及是否处于 C++ 编译环境下[^1]。 对于 iOS 开发中的问题,虽然 `NULL` 和 Objective-C 中的 `nil` 都可以用来表示空对象或者空指针的概念,但在处理视图事件响应链时,它们的作用并直接关联到视图超出父视图范围后的交互行为上。 --- ### 视图超出父视图后事件无法被识别的原因分析 在 iOS 中,如果视图超出了父视图的边界,则默认情况下该区域内的触摸事件会传递给视图。这是因为 UIView 的 `- (UIView *)hitTest:withEvent:` 方法会基于当前视图层次结构和坐标系判断哪个视图应该接收触摸事件。具体来说: - 如果某个触碰位置父视图的有效范围内(由 `bounds` 定义),那么即使存在部分超出边界的视图,也会触发对该视图的事件分发。 - 此外,默认实现还会调用 `- (BOOL)pointInside:withEvent:` 来进一步确认指定点是否属于某特定视图内部。 因此,在这种场景下需要自定义重写上述方法之一或两者来改变默认的行为逻辑以便支持跨边界的手势检测功能[^2]。 #### 自定义解决方案代码示例 以下是通过扩展 hit-testing 行为的一个简单例: ```objective-c @implementation CustomParentView // Override pointInside to include all subviews' areas. - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { BOOL isPointInSelf = [super pointInside:point withEvent:event]; if (!isPointInSelf) { for (UIView *subview in self.subviews) { CGPoint convertedPoint = [self convertPoint:point toView:subview]; if ([subview pointInside:convertedPoint withEvent:event]) { return YES; } } } return isPointInSelf; } @end ``` 此实现在原有基础上增加了对所有控件区域内点击有效性的判定操作,从而允许用户与那些原本因越界而失效的部分进行互动. --- ### 总结 尽管 `NULL` 在程序设计中有重要作用,但它并非解决此类 UI 响应问题的关键所在。针对视图超越父级界限仍需正常接受输入的情况,调整相关视图类别的命中测试机制才是正解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值