我目前正在开发一个使用UIGestureRecognizers的游戏。我使用平移手势来移动播放器,使用轻击手势来检测其他UI按钮的触摸。除了两个手势之间有冲突之外,一切似乎都很好。每当玩家在移动(平移手势被识别)时,游戏会忽略我所有的轻击手势(一旦识别了平移手势,视图就不会识别轻拍手势)。谁能告诉我如何让这两个手势一起工作。我想让玩家在点击UI按钮时停止移动。换句话说,每当识别到轻击手势时,我都想取消平移手势。
提前谢谢你!
下面是我如何设置这两个手势:
let singleTap = UITapGestureRecognizer(target: self, action: #selector(doSingleTap))
singleTap.numberOfTapsRequired = 1
singleTap.delegate = self
self.view?.addGestureRecognizer(singleTap)
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan))
panGesture.minimumNumberOfTouches = 1
panGesture.delegate = self
self.view?.addGestureRecognizer(panGesture)
@objc func handlePan(gestureReconizer: UIPanGestureRecognizer) {
if isPaused || player.isInAction {return}
let translation = gestureReconizer.translation(in: self.view)
if gestureReconizer.state == .changed {
let angle = 180 + (atan2(-translation.x, translation.y) * (180/3.14159))
player.movementAngle = angle
player.atState = .Walk
}
if gestureReconizer.state == .ended {
player.movementAngle = 0.0
if player.atState == .Walk {
player.atState = .Idle
}
}
}
@objc func doSingleTap(gestureReconizer: UITapGestureRecognizer) {
let originaTapLocation = gestureReconizer.location(in: self.view)
let location = convertPoint(fromView: originaTapLocation)
let node = atPoint(location)
switch node.name {
case "HeroAvatar":
//do stuff here
break
case "Fire":
//do stuff here
break
case "Potion":
//do stuff here
break
default:
break
}
}发布于 2018-06-22 13:15:01
您需要实现UIGestureRecognizerDelegate的委托方法,如下所示:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
// Don't recognize a single tap gesture until a pan gesture fails.
if gestureRecognizer == singleTap &&
otherGestureRecognizer == panGesture {
return true
}
return false
}希望这将为您工作:)
有关更多信息,请访问Apple Doc Preferring One Gesture Over Another
https://stackoverflow.com/questions/50980808
复制相似问题