我有一个名为 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
的后续 subview 。我知道我不应该向添加到 mainCanvasView
的每个新 subview 添加平移手势。我如何才能检测到手势在我的 mainCanvasView
中平移的顶部 subview ?
当前无法正常工作的示例:
最佳答案
你应该在所有 subview 中做手势,因为如果 subview 移出主容器 View 的边界,则没有手势会作用于它。您可以创建全高和前面的主视图,或者在添加为 subview 时向它的每个 subview 添加手势。
我仍然在创建灰色主视图和白色 View 是它的 subview 的地方发布代码
这是我的解决方案
你需要的是找到在平移手势期间被触摸的 subview
我创建了 DEMO,其中我创建了一个包含 3 个 subview 的主视图(如果您有图像,请确保启用用户交互)
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)
}
}
关于ios - 如何为未知数量的 subview 设置手势识别器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47194221/