bringSubviewToFront(_ :)函数会破坏UIPanGestureRecognizer

时间:2016-01-04 19:34:33

标签: ios cocoa-touch uiview uigesturerecognizer uipangesturerecognizer

我有一个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),我的代码就像以前一样工作 - 我可以拖动任何子视图,但它低于一些兄弟姐妹。

我很无能为力。可能会发生什么?

2 个答案:

答案 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