2016-03-17 4 views
2

Недавно я отправил версию своей игры TestFlight для внутреннего тестирования. Мой друг заметил, что на его iPhone 6S Plus элементы управления для съемки не работают правильно.Swift SpriteKit 3D Touch и касания перемещены

Элементы управления являются следующие

1) левая половина экрана = прыгать

2) правая половина экрана = стрелять

3) Сдвиньте и удерживайте на правой половине экрана = начать медленно движение

Теперь, когда мои методы касания начались, у меня есть небольшая задержка для съемки, поэтому, если касания переместились, это отменяет стрельбу и начинает медленное движение. Это, похоже, вызывает проблемы с телефонами с поддержкой 3D Touch.

Копаем дальше в этом я наткнулся на этот пост

iOS 9 Spritekit Double Tap Not Working on iPhone 6S

, где в основном говорится, что на 3D сенсорный устройств с поддержкой касаний перемещается метод вызывается автоматически.

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) Можно ли отключить 3D Прикосновение в SpriteKit играх?

2) Это ошибка?

3) любой другой способ использования касаний правильно перемещается на устройствах 3D Touch?

4) В качестве альтернативы я могу использовать распознаватели жестов, чтобы имитировать функцию слайда и удержания, которую я сейчас делаю в касаниях.

Спасибо за любую помощь

+0

Просто быстрое предложение взглянуть на примерное приложение Демо-ботов и посмотреть, будет ли такой же вопрос в этом примере на iPhone 6S. –

+0

Спасибо за предложение. Я часто использую образец DemoBots для своих проектов. Я только что проверил, и они дважды используют методы «touchhesMoved ..». Однако оба находятся в подклассах SKSpriteNodes, поэтому я удивляюсь, что это имеет значение. У меня нет устройства для 3D-touch, поэтому он отстой для тестирования. – crashoverride777

+0

Я тоже. Вы можете распространять демо-ботов вашему другу через дистрибутив OTA (например, TestFlight) для тестирования в качестве последнего средства. –

ответ

2

После пробовать различные другие вещи, которые не работали, в том числе UISwipeGestureRecognizer подклассов, я, наконец, понял это.

Ответ был на самом деле, глядя мне прямо в лицо в том же StackOverflow посте я связан в моем вопросе

iOS 9 Spritekit Double Tap Not Working on iPhone 6S

Решение создать свойство

var startingTouchLocation: CGPoint? 

чем в касаний Началось создание этого имущества

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 


     .... 
    } 
} 

, а затем добавьте чек в touchhesMoved, чтобы вернуться из метода до тех пор, пока не коснется касания.

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 
     .... 
    } 
    } 
+0

У меня с вами такая же проблема. На iPhone 6S метод touchhesMoved был вызван, как только коснулисьBegan. Мы должны позаботиться об этом. – huyleit

+0

Что это значит? Я уже отправил ответ – crashoverride777

Смежные вопросы