如何为未知数量的子视图设置手势识别器
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)
}
}
我有一个名为 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)
}
}