我在应用程序中实现了平移手势以关闭视图。 基本上,当用户向下滑动时,视图将关闭。

但是,我希望它能正常工作,以便用户对角向下或半向下滑动时不会消失。 我只希望它对严格的垂直向下滑动做出响应。 到目前为止,这是我的代码。

    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!
            })
        }
    }
    }
}

#1楼 票数:0

您在currentPositionTouched的正确轨道上。 在您的.began块中,将currentPositionTouched设置为panGesture的位置

currentPositionTouched = panGesture.location(in: view)

然后,在.changed.ended块中,使用检查来确定x值是否相同,并相应地开发逻辑。

if currentPositionTouched.x == panGesture.location(in: view).x

#2楼 票数:0

您可以使用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格式的

  ask by Michael Jajou translate from so

未解决问题?本站智能推荐:

1回复

如何在同一视图上交替使用平移手势和滑动手势?

我有一个包含计数器的视图。 我已经实现了两种不同的手势识别器, UISwipeGesture将计数增加一, 和一个UIPanGesture,以便每次增加多个数字 用户刷卡的时间。 两种姿势都有效,但我的问题是它们不能同时工作。 我希望他们能够交替工作,例如,如
3回复

如何使集合视图响应它自己视图之外的平移手势

我的UIViewController有一个UICollectionView ,我想让它响应UICollectionView内部和外部的手势。 默认情况下, UICollectionView仅响应其自己view的手势,但如何使其响应其view外的滑动? 谢谢。
1回复

UIView 平移手势与系统手势冲突

我正在主视图上安装一个 UIPanGestureRecognizer,如下所示: 问题是它与主页指示器上的系统滑动手势同时识别以关闭应用程序。 我如何避免这种冲突? 编辑:当我使用以下代码使主页按钮指示器变暗时出现问题 - 上面的代码在几秒钟后使主页指示灯变暗。 然后您需要滑动两次以关闭应
2回复

基于平移手势翻译的滚动scrollview

我想知道如何将平移手势y翻译转换为等效于滚动视图内容y偏移量。 因此,在此我可以通过平移手势翻译滚动我的滚动视图,重现自然滚动视图滚动的相同效果。 当我这样做时,它导致滚动非常生涩,因为 scrollYOffset 值在拖动时从 0 变为 54,然后变为 124。 我想要的是使用平移手势平滑
2回复

在平移手势上设置边界

我创建了5个UIView,每个UIView都有UIPanGestureRecognizers,然后将它们添加到另一个UIView中。 所有这些工作正常,我可以将它们拖到各处,但我不希望它们被拖到其父UIView的边界之外。 我已经读过我可以使用gestureRecognizerShouldB
2回复

平移手势无法正常工作

所以我正在创建一个带有网格的应用程序,当我点击时它会创建一个节点。 现在,我目前正在使用 PanGesture 将节点拖放到网格中的不同位置。 现在,我希望我拖动的节点更大(这样用户更容易看到),然后在放下它时恢复到它的大小。 所以我使用“panGesture.state == begin”来实现一
2回复

访问平移手势的速度

我想获得平移手势的速度,我想使用发送者的速度属性,但它似乎不起作用: 但它抛出一个错误说: "ambiguous use of 'velocity'" 如果这不是访问平移手势速度的方法,那是什么?
1回复

如何通过平移手势旋转SCNSphere / Node

因此,对于个人项目,我决定在SceneKit中制作我自己的相机,它基本上复制了默认的相机控件,除非用户放大时,会发出响亮的声音,反之亦然。 此外,当用户平移球时,我还希望声音更快。 我知道如何编辑声音,但我无法实现平移手势。 这是我的相机代码 然后这是我的平移手势代码,现在不起