Как правильно настроить 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
}
}