按位置识别 UIView 中的子视图(CGPoint)

Identify Subview in UIView by Location (CGPoint)

我正在尝试找出在 UIView.

中的给定 CGPoint 处找到确切子视图(如果有的话)的最佳方法

我的 scene/ViewController 的一部分是自定义 UIView 子类(在 XIB 中设计),它提供了 UIStackView 子视图(也是自定义的,XIB 设计的)。

VC 在那个自定义视图上有一个 UITapGestureRecognizer,在我的 @IBAction 中,我想确定它的哪个特定子视图被点击,然后相应地处理它:

@IBAction func handleTap(recognizer:UITapGestureRecognizer) {

    let tapLocation = recognizer.location(in: recognizer.view)
    if let subviewTapped = customView.subviewAtLocation(tapLocation) {
        handleTapForSubview(subviewTapped)
    }
}

但是,我不知道如何实现 subviewAtLocation(CGPoint) 方法。我在标准 UIView 方法中找不到任何内容。

欢迎任何关于如何完成的建议。

或者,我考虑过为每个子视图添加一个点击识别器,然后委托给父视图,然后委托给 VC,但这感觉效率低下,就像它在意见,而不是 VC.

谢谢。

一个解决方案是使用 CGRectcontains(point:) 方法。这个想法是迭代堆栈视图的子视图并检查哪些子视图包含触摸点。这里:

@IBAction func handleTap(recognizer:UITapGestureRecognizer) {
    let tapLocation = recognizer.location(in: recognizer.view)
    let filteredSubviews = stackView.subviews.filter { subView -> Bool in
      return subView.frame.contains(tapLocation)
    }

    guard let subviewTapped = filteredSubviews.first else {
      // No subview touched
      return
    }

    // process subviewTapped however you want
}

//使用 hitTest() 方法。这给出了包含点

的视图
let subView = parentView.hitTest(point, with: nil)