如何为平移手势设置 y 轴的限制?

How do I set limits in the y-axis for a Pan Gesture?

我想将图像视图限制为特定的 y 坐标,但每次我将它拖动到 2 坐标上方或下方时,视图都会卡住并且不再移动。此外,如果我拖动得足够快,imageView 会高于或低于我限制的坐标。

@IBAction func handlePan(_ gesture: UIPanGestureRecognizer) {
      // 1
      let translation = gesture.translation(in: view)

      // 2
      guard let gestureView = gesture.view else {
        return
      }
        
        if gestureView.center.y >= 161 && gestureView.center.y <= 561 {
            gestureView.center.y = gestureView.center.y + translation.y
            gesture.setTranslation(.zero, in: view)
        }
        
      // 3
      gesture.setTranslation(.zero, in: view)
    }

当图像视图的 y 坐标超出指定范围时,与其完全不移动图像视图,不如让图像视图在太高时向下移动,如果太低则向上移动.

指定在哪些情况下您不想移动图像视图会更容易:

  • y < 161 并向上平移
  • y > 561 并向下平移

另外,之所以可以通过快速拖动将其移出有效的y范围,是因为您只在移动之前检查图像视图的y坐标是否在范围内,而在移动之后则不会。您应该在添加 translation.y.

时改为
@IBAction func handlePan(_ gesture: UIPanGestureRecognizer) {
    // 1
    let translation = gesture.translation(in: view)

    // 2
    guard let gestureView = gesture.view else {
        return
    }

    // in these two cases, don't translate the image view
    if (gestureView.center.y < 161 && translation.y < 0) ||
        (gestureView.center.y > 561 && translation.y > 0) {
        gesture.setTranslation(.zero, in: view)
        return
    }

    // clamping the translated y 
    gestureView.center.y = min(max(gestureView.center.y + translation.y, 161), 561)
    gesture.setTranslation(.zero, in: view)
}