Swift SpriteKit 3D Touch和触控移动

时间:2016-03-17 12:20:56

标签: swift touchesmoved 3dtouch

我最近发送了一个版本的游戏到TestFlight进行内部测试。 我的朋友注意到,在他的iPhone 6S Plus上,拍摄的控件无法正常工作。

控件如下

1)屏幕的左半部分=跳跃

2)屏幕的右半部分=拍摄

3)滑动并按住屏幕的右半部分=开始慢动作

现在我的触摸开始方法我有一点点延迟拍摄,所以如果触摸移动被称为取消拍摄并开始慢动作。 这似乎导致3D Touch手机出现问题。

进一步深入研究这篇文章

iOS 9 Spritekit Double Tap Not Working on iPhone 6S

它基本上表明在启用3D Touch的设备上,触摸移动的方法会自动调用。

  On 3D Touch capable devices, touch pressure changes cause     
   touchesMoved:withEvent: to be called for all apps running on iOS   
   9.0. When running iOS 9.1, the method is called only for apps  
   linked with the iOS 9.0 (or later) SDK.

    Apps should be prepared to receive touch move events with no   
    change in the x/y coordinates. "

这似乎可以理解为什么我的朋友有问题,如果触摸移动总是被称为取消拍摄并开始慢动作,即使他没有在屏幕上滑动。

所以我的问题是

1)你可以在SpriteKit游戏中禁用3D Touch吗?

2)这是一个错误吗?

3)在3D Touch设备上正确移动任何其他使用触摸的方法吗?

4)或者,我可以使用手势识别器来模拟我正在移动的触摸中执行的滑动和保持功能。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

在尝试了其他不起作用的东西之后,包括UISwipeGestureRecognizer子类,我终于想通了。

答案实际上是在我在我的问题中链接的相同stackOverflow帖子中直接盯着我

Environment.SpecialFolder

解决方案是创建属性

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    for touch in touches {
        let location = touch.locationInNode(self)

        /// Set starting touch. this is for 3d touch enabled devices, see touchesMoved method below
        startingTouchLocation = location


        ....
     }
 }

比触摸开始设置该属性

 override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    for touch in touches {
        let location = touch.locationInNode(self)

        /// WAY 1 - Check if touch moved because on 3d touch devices this method gets called on a force touch.
        guard location != startingTouchLocation else { return }

        // Your code
        ...

        /// WAY 2 - Add a min distance for the finger to travel in any direction before calling touches moved code
        let minValue: CGFloat = 30
        guard let startingLocation = startingLocation else { return }

        guard currentLocation.y < startingLocation.y - minValue ||
        currentLocation.y > startingLocation.y + minValue ||
        currentLocation.x < startingLocation.x - minValue ||
        currentLocation.x > startingLocation.x + minValue else { return  false }

       // Your code 
       ....
     }
  }

然后在touchesMoved中添加一个检查以从方法返回,直到触摸实际移动为止。

{{1}}