[英]Make a pan gesture respond on vertical swipe downs
我在应用程序中实现了平移手势以关闭视图。 基本上,当用户向下滑动时,视图将关闭。
但是,我希望它能正常工作,以便用户对角向下或半向下滑动时不会消失。 我只希望它对严格的垂直向下滑动做出响应。 到目前为止,这是我的代码。
var originalPosition: CGPoint?
var currentPositionTouched: CGPoint?
func panGestureAction(_ panGesture: UIPanGestureRecognizer) {
if currentScreen == 0 {
let translation = panGesture.translation(in: view)
if panGesture.state == .began {
originalPosition = view.center
//currentPositionTouched = panGesture.location(in: view)
} else if panGesture.state == .changed {
view.frame.origin = CGPoint(
x: view.frame.origin.x,
y: view.frame.origin.y + translation.y
)
panGesture.setTranslation(CGPoint.zero, in: self.view)
} else if panGesture.state == .ended {
let velocity = panGesture.velocity(in: view)
if velocity.y >= 150 {
UIView.animate(withDuration: 0.2
, animations: {
self.view.frame.origin = CGPoint(
x: self.view.frame.origin.x,
y: self.view.frame.size.height
)
}, completion: { (isCompleted) in
if isCompleted {
self.dismiss(animated: false, completion: nil)
}
})
} else {
UIView.animate(withDuration: 0.2, animations: {
self.view.center = self.originalPosition!
})
}
}
}
}
您在currentPositionTouched
的正确轨道上。 在您的.began
块中,将currentPositionTouched
设置为panGesture
的位置
currentPositionTouched = panGesture.location(in: view)
然后,在.changed
和.ended
块中,使用检查来确定x
值是否相同,并相应地开发逻辑。
if currentPositionTouched.x == panGesture.location(in: view).x
您可以使用gestureRecognizerShouldBegin
。 您可以将其设置为仅识别垂直手势(即,其角度小于特定大小的手势)。 例如,在Swift中,它是:
extension ViewController: UIGestureRecognizerDelegate {
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
guard let gesture = gestureRecognizer as? UIPanGestureRecognizer else { return false }
let translation = gesture.translation(in: gesture.view!)
if translation.x != 0 || translation.y != 0 {
let angle = atan2(abs(translation.x), translation.y)
return angle < .pi / 8
}
return false
}
}
只需确保设置平移手势识别器的delegate
。
请注意,我并没有检查它是否绝对垂直(由于手势路径的变化,它很少会完全垂直),而是在一定角度范围内。
仅供参考,这是基于Objective-C格式的 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.