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

记录一下:假如一个 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;
}

你可能感兴趣的:(iOS 父视图外部子视图点击响应 - hitTest)