bringSubviewToFront(_:) 函数打破了 UIPanGestureRecognizer

bringSubviewToFront(_:) function breaks a UIPanGestureRecognizer

我有一个 BoardView class 子 class 是 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
}

这似乎破坏了整个手势识别器:如果我试图在一个子视图周围拖动,pieceDragged(_:) 函数只被调用一次(识别器的状态是 .Began),但是仅此而已。

如果我注释掉 bringSubviewToFront(pieceView),我的代码像以前一样工作 - 我可以在任何子视图周围拖动,但它在它的一些兄弟视图下面。

我一无所知。这里可能发生了什么?

您似乎也在绕着房子转,并实施了一种实际上没有意义的方法。委托方法 gestureRecognizerShouldBegin(_:) 是关于这个识别器是否真的开始检测而不是执行操作的地方。

您已经有一个合适的位置来执行您想要的操作您只需更新您的代码即可

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: ()
  }
}

问题是我替换了 layoutSubviews() 方法中的所有子视图(在调用 bringToFront(_:) 后自动调用)。