Я, по крайней мере, смог вернуть эти события по частному API-интерфейсу, однако keyup не возвращает никакой полезной информации, такой как ключ, который был выпущен. Может быть, это то, что можно вытащить из UIEvent
?
Код, который необходимо добавить, - это следующее определение UIPhysicalKeyboardEvent
.
@interface PhysicalKeyboardEvent : UIEvent {//UIPhysicalButtonsEvent
int _inputFlags;
NSString *_modifiedInput;
NSString *_unmodifiedInput;
NSString *_shiftModifiedInput;
NSString *_commandModifiedInput;
NSString *_markedInput;
long long _modifierFlags;
NSString *_privateInput;
}
+ (id)_eventWithInput:(id)arg1 inputFlags:(int)arg2;
@property(retain, nonatomic) NSString *_privateInput; // @synthesize _privateInput;
@property(nonatomic) int _inputFlags; // @synthesize _inputFlags;
@property(nonatomic) long long _modifierFlags; // @synthesize _modifierFlags;
@property(retain, nonatomic) NSString *_markedInput; // @synthesize _markedInput;
@property(retain, nonatomic) NSString *_commandModifiedInput; // @synthesize _commandModifiedInput;
@property(retain, nonatomic) NSString *_shiftModifiedInput; // @synthesize _shiftModifiedInput;
@property(retain, nonatomic) NSString *_unmodifiedInput; // @synthesize _unmodifiedInput;
@property(retain, nonatomic) NSString *_modifiedInput; // @synthesize _modifiedInput;
@property(readonly, nonatomic) long long _gsModifierFlags;
- (void)_privatizeInput;
- (void)dealloc;
- (id)_cloneEvent;
- (_Bool)isEqual:(id)arg1;
- (_Bool)_matchesKeyCommand:(id)arg1;
//- (void)_setHIDEvent:(struct __IOHIDEvent *)arg1 keyboard:(struct __GSKeyboard *)arg2;
@property(readonly, nonatomic) long long _keyCode;
@property(readonly, nonatomic) _Bool _isKeyDown;
- (long long)type;
@end
Для прослушивания событий используйте UIResponder
. Я не уверен, что ответчик должен быть ключевым или нет.
- (id)_keyCommandForEvent:(PhysicalKeyboardEvent *)event {
//Some reason it gets called twice and it's not because of keyup. Keyup seems to not mention it's original key.
[NSObject cancelPreviousPerformRequestsWithTarget:self];
[self performSelector:@selector(processEvent:) withObject:event afterDelay:0];
return [super _keyCommandForEvent:event];
}
- (void)processEvent:(PhysicalKeyboardEvent *)event {
NSLog(@"%@", [event _unmodifiedInput]);
NSLog(@"%d", [event _isKeyDown]);
NSLog(@"%d", [event _inputFlags]);
if ([event _isKeyDown] && [[event _unmodifiedInput] isEqualToString:@"s"] && [event _modifierFlags]==206158430208) {
NSLog(@"Hello");
}
}
Я надеюсь, что этот код по крайней мере поможет людям, которым это необходимо. Вы можете определить, нажата ли командная клавиша, клавиша выбора и клавиша управления, используя _modifierFlags
. Я не играл с ним много, но, похоже, это хороший способ получить события.
Возможно, вы можете получить код от http://nacho4d-nacho4d.blogspot.com/2012/01/catching-keyboard-events-in-ios.html для улучшения. Если кто-то найдет лучший способ, напишите об этом!
Поскольку это использование частных API, вам может быть лучше всего обернуть все в respondsToSelector
. Такие вещи, как _unmodifiedInput
.
Я не уверен, что яблоко примет приложение, которое реализует это, поэтому используйте на свой страх и риск.
Я искал информацию о UIKeyCommands и оказался в ссылке: P – nacho4d