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

Posted

技术标签:

【中文标题】Swift:处理自定义幻灯片菜单中的快速滑动【英文标题】:Swift: Handling Fast Swipes in Custom Slide Menu 【发布时间】: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 */) 【参考方案1】:

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

【讨论】:

以上是关于Swift:处理自定义幻灯片菜单中的快速滑动的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有第三方库的情况下创建自定义幻灯片菜单。?

在 Swift 中设计自定义轮播组件需要一些帮助

快速视频中的照片上的自定义动画

android 左右滑动菜单

SwiftUI 如何获取自定义幻灯片转换的视图大小?

自定义滑动解锁