невозможно перехватить кнопку «Пауза» на SiriRemote — всегда останавливает фоновую музыку и никогда не возобновляет ее

Я пытаюсь использовать кнопку «Пауза» на SiriRemote, чтобы приостановить игру (SpriteKit, один ViewController, несколько SKScene).

Я использую тот же метод, что и для кнопки меню:

  1. переопределить pressesBegan и pressesEnded в моем GameViewController
  2. передать события UIPressType.PlayPauseUIPressType.PlayPause в текущую сцену, доступную через skView.scene! в виде! PilotButtonDelegate (это мой делегат для обработки этих чертовых кнопок)
  3. В своих сценах я обрабатываю событие и возвращаю Bool обратно в GameViewController, предлагая pressesBegan и pressesEnded вызвать super.< strong>pressesBegan (или Ended) или нет, в зависимости от того, обработал ли я это в своей сцене или нет.

Вышеупомянутое работает как очарование для меню (я хорошо перемещаюсь по сценам), но пауза каким-то образом распространяется обратно на TVOS и приостанавливает мою фоновую музыку, даже если я ее перехватываю (т.е. не вызываю супер). Любые идеи, что я делаю неправильно?

Что удивительно, повторное нажатие PlayPause не запускает музыку.

PS. Я проверил, и такое же поведение (например, музыка приостанавливается, но не возобновляется) происходит, когда я использую кнопку PlayPause в любом другом приложении (например, Поиск / Компьютеры, Фотографии).


person Piotr    schedule 29.10.2015    source источник
comment
Рассматривали ли вы возможность добавления распознавателей UItapGesture вместо методов нажатия? Это то, что я сделал, и это отлично работает   -  person crashoverride777    schedule 11.11.2015
comment
рассмотрю это и сообщу.   -  person Piotr    schedule 13.11.2015
comment
Вы решили свои проблемы. Помог ли мой ответ ниже?   -  person crashoverride777    schedule 24.11.2015
comment
да, спасибо ... извините, что не отметил это   -  person Piotr    schedule 24.11.2015
comment
Нет проблем, рад, что это работает для вас. Спасибо, что отметили.   -  person crashoverride777    schedule 24.11.2015


Ответы (1)


чтобы уточнить мой комментарий выше, вот как это может выглядеть в зависимости от того, какие жесты вы хотите/нужны. Преимущество распознавателей заключается в том, что вы можете добавить их в любую SKScene вместо того, чтобы управлять нажатиями кнопок через gameViewController и делегаты/протоколы. Это намного проще и отлично работает.

func loadTVGameControls() {

    // main (select) button
    let tapMain = UITapGestureRecognizer()
    tapMain.addTarget(self, action: "pressedTVRemoteSelectButton")
    tapMain.allowedPressTypes = [NSNumber (integer: UIPressType.Select.rawValue)]
    self.view!.addGestureRecognizer(tapMain)

    // play pause
    let tapPlayPause = UITapGestureRecognizer()
    tapPlayPause.addTarget(self, action: "pressedTVRemotePlayPauseButton")
    tapPlayPause.allowedPressTypes = [NSNumber (integer: UIPressType.PlayPause.rawValue)]
    self.view!.addGestureRecognizer(tapPlayPause)

     // menu
    let tapMenu = UITapGestureRecognizer()
    tapMenu.addTarget(self, action: "pressedTVRemoteMenuButton")
    tapMenu.allowedPressTypes = [NSNumber (integer: UIPressType.Menu.rawValue)]
    self.view!.addGestureRecognizer(tapMenu)

    // swipe right
    let rightSwipe = UISwipeGestureRecognizer(target: self, action: "swipedRightTVRemote")
    rightSwipe.direction = UISwipeGestureRecognizerDirection.Right
    self.view!.addGestureRecognizer(rightSwipe)

    // swipe left ...
    // swipe up ...
    // swipe down ...
}


func pressedTVRemoteSelectButton() {
     // do something
}

func pressedTVRemotePlayPauseButton() {
     // do something
}

func pressedTVRemoteMenuButton() {
     // do something
}

func swipedRightTVRemote() {
    // do something
}

Вы можете использовать разные методы для разных сценариев. В моей игре, которую я только что преобразовал в tvOS, у меня есть 1, как в примере выше, и еще 2, как в моем GameScene.swift.

1) loadTVPauseControls() // новые жесты для паузы в игре

2) loadTVGameOverControls() // новые жесты, когда игра окончена

Просто используйте приведенный ниже метод, чтобы отключить жесты перед их изменением или при переходе к новой сцене.

// MARK: - Disable All Gestures
func disableAllGestures() {
    guard let view = view else { return }
    guard view.gestureRecognizers != nil else { return }
    for gesture in view.gestureRecognizers! {
        if let tapRecognizer = gesture as? UITapGestureRecognizer {
            view.removeGestureRecognizer(tapRecognizer)
        }
        if let swipeRecognizer = gesture as? UISwipeGestureRecognizer {
            view.removeGestureRecognizer(swipeRecognizer)
        }
    }
}
person crashoverride777    schedule 13.11.2015