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

时间:2017-11-09 05:01:28

标签: ios swift uigesturerecognizer uipangesturerecognizer

我有一个名为mainCanvasView的主视图,我符合UIGestureRecognizerDelegate并设置了pan手势,如下所示:

    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中检测到手势已平移的顶级子视图?

当前不起作用的示例:

enter image description here

1 个答案:

答案 0 :(得分:1)

您应该在所有子视图中进行手势,因为如果子视图移出主容器视图的边界,则不会对其进行任何操作。要么创建主视图全高度,要么在前面添加手势,或者在添加为子视图时为其添加手势。

我仍在发布代码,其中我创建了灰色主视图,白色视图是其子视图

这是我的解决方案

您需要找到在平移手势期间触摸过的子视图

我创建了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)




    }
}

enter image description here