美文网首页
iOS 父视图外部子视图点击响应 - hitTest

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

作者: Finger_s | 来源:发表于2021-08-27 10:26 被阅读0次

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

          本文链接:https://www.haomeiwen.com/subject/eofmiltx.html