我有一个BoardView
类,其子类为UIView
。它有几个子视图,都有自己的UIPanGestureRecognizer
。我使用这个识别器来拖动我的BoardView
实例中的子视图,如下所示:
func pieceDragged(recognizer: UIPanGestureRecognizer) {
let pieceView = recognizer.view!
if recognizer.state == .Began || recognizer.state == .Changed {
// move the pieceView by the appropriate amount
let translation = recognizer.translationInView(self)
pieceView.center = CGPoint(x: pieceView.center.x + translation.x, y: pieceView.center.y + translation.y)
recognizer.setTranslation(CGPoint.zero, inView: self)
} else if recognizer.state == .Ended {
// do something else
}
}
这很好用。
问题在于我希望被拖动的子视图位于其所有兄弟节点之上,因此我将BoardView
实例作为每个手势识别器的委托并覆盖此函数:
override func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
let pieceView = gestureRecognizer.view!
bringSubviewToFront(pieceView)
return true
}
这似乎打破了整个手势识别器:如果我尝试将aroudn拖动到子视图,pieceDragged(_:)
函数只调用一次(识别器的状态为.Began
),但不再不止于此。
如果我评论bringSubviewToFront(pieceView)
,我的代码就像以前一样工作 - 我可以拖动任何子视图,但它低于一些兄弟姐妹。
我很无能为力。可能会发生什么?
答案 0 :(得分:1)
问题是我在layoutSubviews()
方法中替换了所有子视图(在bringToFront(_:)
被调用后自动调用)。
答案 1 :(得分:0)
看起来你也要绕过房子并实施一种没有意义的方法。如果此识别器实际上开始检测不是执行操作的位置,那么代理方法func pieceDragged(recognizer: UIPanGestureRecognizer) {
guard let pieceView = recognizer.view else {
return
}
switch recognizer.state {
case .Began:
pieceView.superview?.bringSubviewToFront(pieceView)
case .Changed:
let translation = recognizer.translationInView(self)
recognizer.setTranslation(CGPoint.zero, inView: self)
pieceView.center = CGPoint(x: pieceView.center.x + translation.x, y: pieceView.center.y + translation.y)
default: ()
}
}
就是关键。
您已经有一个合适的位置来执行您想要的操作,只需将代码更新为
即可REL