如何处理横向滑动

Posted

技术标签:

【中文标题】如何处理横向滑动【英文标题】:How to handle sideways swipes 【发布时间】:2020-07-28 01:21:22 【问题描述】:

我正在创建一个游戏,您可以在其中使用滑动进行控制,我想知道是否可以使用 UIGestureRecodnizer 处理横向滑动?

如果是这样,我该怎么做。

换句话说:

我如何获得 8 个方向,而不是 4 个方向:

从上、下、右、左到上、上、下、右下、左下、上、下、右、左?

另外,如何正确区分两次滑动和两次单次滑动,UIGestureRecognizer 是否有内置超时?

【问题讨论】:

【参考方案1】:

这可能需要一些清理,但它有效:

// a uiview that tracks touches in 8 directions when swiped
class TouchRecognizer: UIView
    
 // used for calculating degree between touches
    var startTouch: CGPoint = CGPoint(x: 0, y: 0)
    var endTouch: CGPoint = CGPoint(x: 0, y: 0)
    
    // gets initial touch
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
        let touch = touches.first!
        let location = touch.location(in: self)
    
        startTouch = location
    
    
    // gets end touch, then checks angle
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) 
        let touch = touches.first!
        let location = touch.location(in: self)
        endTouch = location
       
        HandleSwipe()
   
    
    
    // Gets The Degree between the two touches
    func HandleSwipe()
        let p1 = startTouch
        let p2 = endTouch
        
        let center = CGPoint(x: (p1.x), y: (p1.y + 1))
        let v1 = CGVector(dx: p1.x - center.x, dy: p1.y - center.y)
        let v2 = CGVector(dx: p2.x - center.x, dy: p2.y - center.y)
        let angle = atan2(v2.dy, v2.dx) - atan2(v1.dy, v1.dx)
        let deg = angle * CGFloat(180.0 / .pi)
        
        PrintDirection(degree: deg)
    
    
    
    // uses the degree between touches to figure out the direction user swiped
    func PrintDirection(degree: CGFloat)
        
        // if needed, adjust degree angles for optimized swiping
        if(degree < 30 && degree > -10)
            print("Up")
        
        else if(degree > 30 && degree < 60)
            print("UpRight")
        
        else if(degree > 75 && degree < 120)
            print("Right")
        
        else if(degree > 120 && degree < 150)
            print("downRight")
        
        else if(degree > 150 && degree < 210)
            print("Down")
        
        else if(degree > 210 && degree < 240)
            print("downleft")
        
        else if(degree > 240 && degree < 300)
            print("Left")
        
        else if(degree > 300 && degree < 360)
            print("upLeft")
        
        else if(degree < -30 && degree > -60)
            print("upLeft")
        
        else if(degree < -60)
                  print("left")
              
    
    

【讨论】:

如果你有问题请告诉我,我是在休息时做的,所以很草率,但是当我回到家时,我会把它作为你的扩展,这样更容易使用/清洁代码向上 我理解我将此扩展添加到 GameViewController 并将变量发送到 SKScene 是正确的? 好的,对于任何想要在 SKScene 方向上使用它的人,都被移动了 180 度,所以它向下,向下,向右,向上,向上,向上,向左,向左,向下,向左,向左 不,它现在是一个 UI 视图,有点像统一的画布。你让它工作了吗?您必须添加视图! 我刚刚将所有内容转移到 GameScene 中,因为它也有 touchesBegan/Ended 方法,但它适用 180 条规则,但它仍然有效。谢谢您的帮助!

以上是关于如何处理横向滑动的主要内容,如果未能解决你的问题,请参考以下文章

Vue中如何用鼠标滑轮进行横向滑动不显示滚动条

向左滑动时如何处理UITableViewCell删除按钮动画?

Android:如何处理从右到左的滑动手势

iOS UICollectionView横向滑动并且横向加载数据

导航栏实现横向滑动效果

swiper插件 滑动到某屏时,如何处理的函数