2021-07-13

这篇博客介绍了如何在iOS开发中,使子view的响应区域超过父view的边界仍然能捕捉到点击事件。通过重写`hitTest:withEvent:`和`pointInside:withEvent:`方法,可以改变事件分发机制,使得触摸点在子view超出父视图部分时仍能被正确识别。这一技术涉及到iOS的hit-Testing机制,对于构建复杂的用户交互界面非常有用。
摘要由CSDN通过智能技术生成

iOS开发——子view的响应区域大于父view的响应区域

在这里插入图片描述
此时点击按钮超出父控件 的部分时 不会响应对应的方法 ,如果想要实现,

1.重写父控件的- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;方法

//重写该方法后可以让超出父视图范围的子视图响应事件

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *view = [super hitTest:point withEvent:event];
    if (view == nil) {
        for (UIView *subView in self.subviews) {
            CGPoint tp = [subView convertPoint:point fromView:self];
            if (CGRectContainsPoint(subView.bounds, tp)) {
                view = subView;
            }
        }
    }
    return view;
}

2.重写父控件的- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event的方法

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
    //if内的条件应该为,当触摸点point超出蓝色部分,但在黄色部分时
    if (.....){
     return YES;
    }
    return NO;
  }

原理:

这和iOS的事件分发机制 hit-Testing有关,简单的说,hit-Testing的作用就是找出你每次触摸屏幕,点到的究竟是哪个view。

比如以下这个图
在这里插入图片描述

当我去点击View-C的时候,hit-Testing实际上是这样检测的
1.首先,视图会先从View-A开始检查,发现触摸点在View-A,所以检查View-A的子视图View-B。
2.发现触摸点在View-B内,好棒!看看View-B内的子视图View-C。
3.发现触摸点在View-C内,但View-C没有子视图了,所以View-C是此次触摸事件的hit-TestView了。

那么UIView中其实提供了两个方法来确定hit-TestView
1.- (UIView )hitTest:(CGPoint)point withEvent:(UIEvent )event;
2.- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;//这个就是我们上面重写的方法

注意其实在每次递归去调用hitTest:(CGPoint)point withEvent:(UIEvent *)event之前,都会调用pointInside:withEvent:来确定该触摸点是否在该View内。

所以当我们重写pointInside:(CGPoint)point withEvent:(UIEvent *)event后,其实我们的点击后调用hitTest来递归的找hit-TestView的区域从这样:

在这里插入图片描述

变成了这样:

在这里插入图片描述

这样当我们愉快的点击上半凸起的区域时,hit-Testing便回去检查蓝色视图内的子视图,即黄色区域。从而来完成此次触摸事件。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值