ios 子视图超出父视图的应的解决办法

本文探讨了在iOS开发中,当popView超出父视图范围且包含tableView时,tableViewCell点击事件无法响应的问题。通过对比两种hitTest实现方式,详细解释了为何第一种方法会导致cell点击失效,而第二种方法可以解决此问题。

 

//我的情况是导航栏上加一个popView,超出了父视图,,popView上还有个tableView,cell点击没反应,往上大部分是说用下面的第一种方法,第一种方法父视图是可以获取到点击事件,但tableIewCell点击没法响应,但是换下面第二种方法,cell就可以点击响应了,具体原因查看响应链,只说明一下相同情况下,我遇到的问题

 

-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event{

    UIView*view = [super hitTest:point withEvent:event];

    if(view ==nil) {

        

        for(UIView*subView in self.subviews) {

            CGPoint myPoint = [subView convertPoint:point fromView:self];

            if(CGRectContainsPoint(subView.bounds, myPoint)) {

                return subView;

            }

        }

    }

    return view;

}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{

    return YES;

}

### 关于 `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、付费专栏及课程。

余额充值