【发布时间】: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 */)
标签: ios swift swipe uipangesturerecognizer