我有一个名为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
中检测到手势已平移的顶级子视图?
当前不起作用的示例:
答案 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)
}
}