【问题标题】:Swift: Handling Fast Swipes in Custom Slide MenuSwift:处理自定义幻灯片菜单中的快速滑动
【发布时间】:2019-12-07 19:02:28
【问题描述】:

我有一个redView: UIView 和一个pan gesture。它只能水平滑动。我希望这个视图在向左滑动时停止在某个点。

目前,如果缓慢/正常滑动,它会按预期工作。但是,如果滑动速度比平均速度快/非常快,则视图会在所需点之后的一段距离处停止。

我在UIPanGestureRecognizer.State 开关中使用guard 语句,如下所示:

case .changed:
    guard abs(redViewX) < 150 else { return }
    //do magic

因此,如果滑动得更快,视图可能会停在x = 160171 等处。这取决于您实际滑动的速度。

你知道如何在需要的点停止视图,这样用户甚至不能滑动到150 + 1点吗?


更新:

我终于解决了这个问题。结果如下:

这是我想出的一个简化的解决方案:

func expandMenu(_ value: Bool) {
        UIView.animate(withDuration: 0.1, delay: 0, options: .curveEaseOut, animations: {
            redView.frame.origin.x = value ? -150 : 0
            gesture.setTranslation(.zero, in: self.view)
        }, completion: nil)
    }

switch gesture.state {
case .changed:
    let swipingToLeft = translation < 0

    if swipingToLeft {
        guard abs(redViewX) < yellowViewWidth else { return }

        if abs(translation) + abs(redViewX) > yellowViewWidth {
            expandMenu(true)
        } else {
            redView.frame.origin.x += translation
        }
        gesture.setTranslation(.zero, in: view)
    } else {
        guard redViewX < 0 else { return }

        if translation - abs(redViewX) > 0 {
            expandMenu(false)
        } else {
            redView.frame.origin.x += translation
        }
        gesture.setTranslation(.zero, in: view)
    }
}

【问题讨论】:

  • 您是否尝试过在您的guardelse 块中将myView.frame.origin.x 设置为您想要的值?
  • 是的,我有。问题是guard 语句在x 位置获得&gt; 150 之后运行。所以我的观点转到x = 160,然后立即转到x = 150。它在屏幕上很明显,所以这不是完美的解决方案:im2.ezgif.com/tmp/ezgif-2-ff274f2bfe2b.gif
  • 我建议不要使用guard,而是使用min 设置视图的框架。例如,myView.frame.origin.x = min(200, /* however you're calculating origin.x */)

标签: ios swift swipe uipangesturerecognizer


【解决方案1】:

当滑动速度很快时,transition.x 值会跳跃,在这种情况下,您似乎没有正确处理更新。 例如,origin.x 从 250 跳到 190,看起来你忽略了这个更新。 我建议你将保护内部的 myView.frame.origin.x 设置为 200,这样它就不会卡在中间。 如果它没有帮助 - 提供更多代码以使问题更清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2015-04-21
    • 2019-01-29
    相关资源
    最近更新 更多