iOS 父视图外部子视图点击响应 - hitTest

251 阅读1分钟

记录一下:假如一个 UIView(我们称作 FatherView),有一个 subview(我们称作 ChildView),这个 ChildView 在 FatherView 的 frame 外部,那么默认情况下,这个 ChildView 被点击的时候,并不会触发 FatherView 的点击响应链(这是合情合理的,FatherView 所在的位置都没被点击,它不遍历 subviews,不作回应是正常的),这时候怎样才能让这个 ChildView 相应点击事件?其实思路是很简单的,监控屏幕上的所有点击事件的区域,如果这个区域和我们的 UIView 以及其 subview 的 CGRect 有重合,就作出反应。

** UIKit 提供了一个现成的方法来做到这件事:**

image.png

image.png

在自定义的UIView视图类中 重写如下代码

不说废话了上代码

Swift


import UIKit

class FatherView: UIView {

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {

        print("Detect Touch Event")

        if (self.isHidden == false) && (alpha > 0) {            

            for subview in subviews {

                if subview.frame.contains(point) {

                    if subview.isKind(of: ChildView1.self) {

                        print("view 1")

                        return subview

                    }

                    if subview.isKind(of: ChildView2.self) {

                        print("view 2")

                        return subview

                    }

                }

            }

        }

        return nil

    }

}

iOS


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

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

    if (view == nil) {

        //将坐标由当前视图发送到 指定视图 fromView是无法响应的范围小父视图

        CGPoint stationPoint = [_ChildView1 convertPoint:point fromView:self];

        if (CGRectContainsPoint(_ChildView1.bounds, stationPoint))

        {

            view = _ChildView1;

        }

    }

    return view;

}