hit-Testing 子视图超出父试图部分上的控件响应事件

       之前面试遇到了一个问题,问我超出父试图部分的子视图上面的控件能否响应事件。我当时回答能展示出来但是不能响应。能展示是我之前做过,但是是否能够响应事件我就不清楚了。面试官应该也是没有做过,因为当我说能展示的时候,他是拒绝的。。。好了,搜集了下资料终于知道是怎么回事了,知其然还要知其所以然嘛!不就是个iOS事件分发机制,这才知道了iOS有个hit-Testing,作用就是找到你每次触摸屏幕,点到的具体是哪个view。


***原理如下:

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:

- (UIView )hitTest:(CGPoint)point withEvent:(UIEvent )event;
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;


那么如果是要子视图超出父试图部分上面的控件可以响应事件,我们只需要重写上述方法就ok了:

- (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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值