Редактор уровней SpriteKit Xcode без событий касания в пользовательском классе кнопок (3D Touch)

xcode button sprite-kit

75 просмотра

1 ответ

8682 Репутация автора

У меня проблемы с настройкой пользовательских кнопок SKSpriteNode для работы с редактором уровней xCode на устройствах с 3D Touch.

У меня есть подкласс кнопки, который в основном основан на образце DemoBots от Apple.

Основной код будет таким

enum ButtonIdentifier: String {
    case playButton
    case pauseButton
}

/// Button responder delegate 
protocol ButtonDelegate: class {
    func pressed(button button: ButtonNode)
}

class ButtonNode: SKSpriteNode {

    public weak var delegate: ButtonDelegate? {
         return scene as? ButtonDelegate
    }

     var isHighlighted = false {
         didSet {
            // running skactions to colorise buttons and animate
         }
     }

    var identifier: ButtonIdentifier!


     /// Code init (when button is created in code)
     /// e.g let playButton = ButtonNode(imageNamed: "ButtonImage", identifier: playButton)

     init(imageNamed: String, identifier: ButtonIdentifier) {
           self.identifier = identifier
           let texture = SKTexture(imageNamed: imageNamed)
           super.init(texture: texture, color: SKColor.clearColor(), size: texture.size())

           name = identifier.rawValue
           setup()
     }

     /// Level editor init (when button is created in level editor)
     required init?(coder aDecoder: NSCoder) {
          super.init(coder: aDecoder)

          // Ensure that the node has a supported button identifier as its name.
          guard let nodeName = name, identifier = ButtonIdentifier(rawValue: nodeName) else {
              fatalError("Unsupported button name found.")
          }

          self.identifier = identifier
          setup()
      }

      private func setup() {

         // zPosition
         zPosition = 200

         // Enable user interaction on the button node to detect tap and click events.
          userInteractionEnabled = true
       }


      #if os(iOS)
      override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
          super.touchesBegan(touches, withEvent: event)

          isHighlighted = true
     }

      override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
         super.touchesEnded(touches, withEvent: event)

         guard let scene = scene else { return }

         for touch in touches {
             let location = touch.locationInNode(scene)
             let node = scene.nodeAtPoint(location)

             if node === self || node.inParentHierarchy(self) {
                 runPressedAction()
             } else {
                 isHighlighted = false
             }
         }
     }

     override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
         super.touchesCancelled(touches, withEvent: event)
         isHighlighted = false
     }
      #endif

     // MARK: - Pressed Action
     private func runPressedAction() {

       // SKAction that runs a press animation
       delegate?.pressed(button: self)
   }
}

Если я создаю кнопку с помощью редактора уровней xCode, все работает нормально в симуляторе или на моем iPhone 6, однако при использовании тестового полета мой друг с 6s Plus не получает сенсорного ввода на кнопках, он не может их нажимать.

Если я создаю кнопку все в коде, то все работает, даже на устройствах с 3d touch.

Почему он не работает с кнопками из редактора уровней на устройствах с 3d touch? Я пытался посмотреть на пример яблочных демо-ботов, чтобы увидеть, пропустил ли я какие-то настройки или что-то в этом роде, но не могу понять. (Кнопки демо-ботов работают на моих друзьях iPhone 6s plus)

Я знаю, что на сенсорных устройствах 3d вызывается метод touchesMoved, хотя в координатах x / y нет никаких изменений. Однако я не думаю, что это вызывает мои проблемы, потому что при создании кнопок в коде все работает как положено.

Есть ли какие-то настройки в редакторе уровней XCode, которых мне не хватает, чтобы разрешить касания на устройствах с 3D-сенсором?

Автор: crashoverride777 Источник Размещён: 18.07.2016 09:41

Ответы (1)


0 плюса

8682 Репутация автора

Решение

После нескольких дней разочарований оказалось, что это ошибка iOS 9. Мой друг работал на iOS 9.2.x, и после того, как он обновился до последней версии iOS 9.3.x, все работает, код не меняется там, где требуется вообще.

Автор: crashoverride777 Размещён: 02.08.2016 03:21
Вопросы из категории :
32x32