IOS: Как обнаружить клавиши escape/control на аппаратной клавиатуре Bluetooth?
Я пытаюсь понять, как обнаружить, что Escape (и другие комбинации клавиш, такие как Ctrl и alt) были нажаты на клавиатуре Bluetooth, подключенной к устройству iOS.
Некоторые ответы, похоже, предполагают, что это невозможно. Однако в Appstore есть приложения, которые делают это (например, iSSH), поэтому я предполагаю, что это возможно, используя общедоступные API.
Я попытался создать свой собственный UITextInput, однако это ничего не получает при нажатии клавиши Escape. Единственная часть API, которую я могу увидеть, где iPad может реагировать, - это когда VoiceOver включен (Escape работает как в Safari), поэтому мне интересно, есть ли способ через API доступности?
Я также пытался посмотреть, есть ли что-то, что я могу наблюдать из NSNotificationCenter, который мог бы помочь, но еще ничего не нашел.
Предложения приветствуются, я вот-вот взломал это на день, и теперь я немного потерял.
Ответы
Ответ 1
Вы можете сделать это сейчас в iOS 7. Например, чтобы реализовать escape-ключ, переопределите UITextView и поместите в свой класс следующие методы:
- (NSArray *) keyCommands {
UIKeyCommand *esc = [UIKeyCommand keyCommandWithInput: UIKeyInputEscape modifierFlags: 0 action: @selector(esc:)];
return [[NSArray alloc] initWithObjects: esc, nil];
}
- (void) esc: (UIKeyCommand *) keyCommand {
// Your custom code goes here.
}
Вам не нужно проверять, что вы находитесь на iOS 7, поскольку более ранние версии ОС не будут вызывать метод keyCommands.
Ответ 2
Нет публичных API для того, что вы намереваетесь выполнить, поэтому это может привести к отказу.
Если вы готовы рискнуть, вы можете попробовать this. В основном перехватывает все события, отправленные в ваше приложение, перезаписывая sendEvent:
в UIApplication
.
Ответ 3
AFAIK это невозможно с использованием общедоступного API.
Я немного поработал, и ключ esc не распознается.
Единственное, что я не делал, это попробовать iSSH
(он стоит 9 €:-), но если вы прочитаете описание в AppStore, то станет ясно, что клавиша esc на аппаратной (bluetooth) клавиатуре не работает, t:
-
Поддержка исчерпывающего ключа. Имеет ключи arrow (всплывающее окно или панель инструментов). ctrl, alt, esc, tab, shift, Fn (1-10), `, PgUp, PgDown и для тех ключей, которые не указаны, означает их добавить.
-
Поддержка клавиатуры Bluetooth для клавиш arrow, function и переназначение ключа ctrl с помощью сопоставления ключей опций на сервере или терминале X11/VNC
. Когда включено, пресет Option + key отображает эквивалент ctrl + key.
Как вы можете видеть, во второй строке ключ esc не упоминается.
Более того, я нашел это (старое) сообщение .
EDIT:
Как ваши последние обновления, я нашел способ "скрыть" _gsEvent
внутри двоичного файла. Однако я не знаю, может ли Apple статический анализатор найти его.
Трюк прост... создайте селектор _gsEvent
(и другие частные селекторы) во время выполнения!
-(void)sendEvent:(UIEvent *)event
{
SEL aSelector = NSSelectorFromString([self theSelector]);
if ([event respondsToSelector:aSelector]) {
NSLog(@"Event: %@", event.description);
}
[super sendEvent:event];
}
-(NSString *)theSelector
{
// compose the keyword as you prefer
NSString *sel = [NSString stringWithFormat:@"%@g%@%@ent", @"_", @"s", @"Ev"];
return sel;
}
Я попытался выполнить поиск внутри двоичного файла, и я не нашел ключевое слово _gsEvent
, очевидно, потому что он создан только во время выполнения.
Надеюсь, это поможет.