ios - Swift:处理自定义幻灯片菜单中的快速滑动

标签 ios swift swipe uipangesturerecognizer

我有一个带有平移手势redView: UIView。它只能水平滑动。我希望这个 View 在向左滑动时停止在某个点。

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

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

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

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

您是否知道如何将 View 停止在所需的点,以便用户甚至无法滑动到 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)
    }
}

最佳答案

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

关于ios - Swift:处理自定义幻灯片菜单中的快速滑动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59229280/

相关文章:

ios - 如何取消 CGContextClipToRect? (iOS)

android - Phonegap/ Cordova : get images from server

ios - 如何获取 UIView 中的所有 UILabel

ios - objectForKey 在 Swift 中为 NSUserDefaults 返回 nil

ios - 函数签名特化 <Arg[0] = Owned To Guaranteed>

ios - 有什么方法可以在 iOS 中使用 swift 将用户名和密码保存在设备中,这与 Android 中的偏好相同?

swift - 从 UIStackView 中拖动和删除 UIView 但将其保留在其放置目的地

ios - 无需触摸即可滑动 UITableViewCell

c# - 向上、向下、向左或向右滑动时,如何调用另一个类中的方法? Unity2D

android - 如何正确处理 recyclerView 上的滑动删除?