繁体   English   中英

使平移手势响应垂直向下滑动

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM