Как правильно настроить GCController valueChangeHandler в Xcode?

Я успешно подключил двухканальный аналоговый контроллер Nimbus из стали, чтобы использовать его для тестирования в приложениях iOS и tvOS. Но я не уверен, как правильно настроить valueChangeHandler часть моего GCController имущество.

Я так понимаю, что есть microGamepad, gamepad а также extendedGamepad классы контроллеров и различия между ними. Я также понимаю, что вы можете проверить, доступен ли соответствующий класс контроллера на контроллере, подключенном к вашему устройству.

Но сейчас у меня проблемы с настройкой valueChangeHandler потому что если я установлю три порции valueChangeHandler следующим образом, то только valueChangeHandler это работает последний загруженный в этой последовательности:

self.gameController = GCController.controllers()[0]

self.gameController.extendedGamepad?.valueChangedHandler = { (gamepad, element) -> Void in
    if element == self.gameController.extendedGamepad?.leftThumbstick {
        //Never gets called
    }
}

self.gameController.gamepad?.valueChangedHandler = { (gamepad, element) -> Void in
    if element == self.gameController.gamepad?.dpad {
        //Never gets called   
    }
}

self.gameController.microGamepad?.valueChangedHandler = { (gamepad, element) -> Void in
    if element == self.gameController.microGamepad?.dpad {
        //Gets called
    }
}

Если я переключу их и позвоню self.gameController.extendedGamepad.valueChangeHandler... наконец, тогда эти методы будут работать и gamepad а также microGamepad методов не будет.

Кто-нибудь знает, как это исправить?

1 ответ

Вы проверяете, какой профиль доступен, и в зависимости от профиля вы устанавливаете значение ChangedHandler.

Важно понимать, что extendedGamepad содержит больше всего функций, а минимум - microGamepad (я думаю, что microGamepad используется только для пульта AppleTV). Поэтому чеки следует заказывать иначе. ExtendedGamepad имеет все функции microGamepad + дополнительные элементы управления, поэтому в вашем коде метод всегда будет входить в профиль microGamepad.

Apple использует следующий код в примере проекта DemoBots:

private func registerMovementEvents() {
    /// An analog movement handler for D-pads and movement thumbsticks.
    let movementHandler: GCControllerDirectionPadValueChangedHandler = { [unowned self] _, xValue, yValue in
        // Code to handle movement here ...
    }

    #if os(tvOS)
    // `GCMicroGamepad` D-pad handler.
    if let microGamepad = gameController.microGamepad {
        // Allow the gamepad to handle transposing D-pad values when rotating the controller.
        microGamepad.allowsRotation = true
        microGamepad.dpad.valueChangedHandler = movementHandler
    }
    #endif

    // `GCGamepad` D-pad handler.
    // Will never enter here in case of AppleTV remote as the AppleTV remote is a microGamepad
    if let gamepad = gameController.gamepad {
        gamepad.dpad.valueChangedHandler = movementHandler 
    }

    // `GCExtendedGamepad` left thumbstick.
    if let extendedGamepad = gameController.extendedGamepad {
        extendedGamepad.leftThumbstick.valueChangedHandler = movementHandler
    }
}
Другие вопросы по тегам