如何设置平移手势的 y 轴范围?

Posted

技术标签:

【中文标题】如何设置平移手势的 y 轴范围?【英文标题】:How do I set limits in the y-axis for a Pan Gesture? 【发布时间】:2020-08-20 05:29:55 【问题描述】:

我想将我的图像视图限制为特定的 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)
    

【问题讨论】:

使用一个点作为最后一个点作为类变量...检查而不是检查gestureView.center 【参考方案1】:

当它的 y 坐标超出指定范围时,您仍然应该允许图像视图向下移动,如果它太高,则向上移动,如果它太低,则向上移动,而不是根本不移动图像视图。

指定在哪些情况下希望移动图像视图会更容易:

y y > 561 并向下平移

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

@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)

【讨论】:

现在它根本不起作用。图像视图只是上升并停在极限处。根本下不去,图片卡在顶部 @DisplayName555 我才意识到我打错了。 Now I corrected it你在应用我的答案时意识到了吗? 哦,是的,感谢您修改它,因为我真的很困惑。现在完美运行

以上是关于如何设置平移手势的 y 轴范围?的主要内容,如果未能解决你的问题,请参考以下文章

将平移手势限制为设置帧

d3.js & nvd3.js -- 如何设置 y 轴范围

斯威夫特:如何设置最大/最小平移手势?

Python、Matplotlib、subplot:如何设置轴范围?

核心图:捏以更改 x 轴范围

ECharts图表柱状图可以动态设置y轴最大值吗