如何为未知数量的子视图设置手势识别器

How to set up gesture recognizers for an unknown number of subviews

我有一个名为 mainCanvasView 的主视图,我在其中符合 UIGestureRecognizerDelegate 并按如下方式设置了平移手势:

    let panGesture = UIPanGestureRecognizer(target: self, action:#selector(self.handlePanGesture(gesture:)))
    self.mainCanvasView.addGestureRecognizer(panGesture)  


    func handlePanGesture(gesture: UIPanGestureRecognizer) {
        if gesture.state == UIGestureRecognizerState.began || gesture.state == UIGestureRecognizerState.changed{
            let translation = gesture.translation(in: view)
            gesture.view?.transform = (gesture.view?.transform)!.translatedBy(x: translation.x, y: translation.y)
            gesture.setTranslation(CGPoint(x: 0, y: 0), in: view)
        }
    }

目前,结果如下所示:

我的目标是 不是 平移 mainCanvasView,而是用户可以添加到 mainCanvasView 的后续子视图。我知道我 不应该 向添加到 mainCanvasView 的每个新子视图添加平移手势。我如何才能检测到手势在我的 mainCanvasView 中平移的顶部子视图?

当前无法正常工作的图示示例:

您应该在所有子视图中进行手势操作,因为如果子视图移出主容器视图的边界,则不会对其进行手势操作。您可以创建主视图的全高和前面,或者在添加为子视图时向它的每个子视图添加手势。

我仍然在创建灰色主视图和白色视图是它的子视图的地方发布代码

这是我的解决方案

你需要的是找到在平移手势中被触摸的子视图

我创建了 DEMO,其中我创建了一个包含 3 个子视图的主视图(如果您有图像,请确保启用用户交互)

func handlePanGesture(gesture: UIPanGestureRecognizer) {

    if gesture.state == UIGestureRecognizerState.began || gesture.state == UIGestureRecognizerState.changed {

        var viewNew = UIView(frame: view.frame)

        for view in self.viewMain.subviews {
            let point = gesture.location(in: view)
            if (view.hitTest(point, with: nil) != nil) {
                viewNew = view
                break

            } else {
                print("Not Tapped")
            }
        }

        print("View Tapped")


        let translation = gesture.translation(in: view)
        viewNew.transform = (viewNew.transform).translatedBy(x: translation.x, y: translation.y)
        gesture.setTranslation(CGPoint(x: 0, y: 0), in: viewNew)




    }
}