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 = 160
或171
等处。这取决于您实际滑动的速度。
你知道如何在需要的点停止视图,这样用户甚至不能滑动到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)
【问题讨论】:
您是否尝试过在您的guard
的else
块中将myView.frame.origin.x
设置为您想要的值?
是的,我有。问题是guard
语句在x
位置获得> 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:处理自定义幻灯片菜单中的快速滑动的主要内容,如果未能解决你的问题,请参考以下文章