连接外部键盘时支持命令,控制和箭头键

时间:2012-06-26 05:21:53

标签: objective-c ios keyboard

我有一个iOS应用程序,我想要做的就是提供更多支持基本命令键组合,例如命令+ a,命令+ s,命令+ x,命令+ v和朋友,当用户连接蓝牙键盘时

我知道这是可能的。诸如Textastic和许多其他编辑应用程序等应用程序都支持这些功能。

我查看了UIResponder(它似乎只用于弹出菜单),UIKeyInput,UITextInput [Delegate]和其他API文档,但没有参考如何执行此操作。

很容易支持在UIMenuController中使用(BOOL)canPerformAction:(SEL)动作withSender:(id)发送者显示哪些选项。但是,当连接蓝牙键盘时,似乎不会调用此方法。所以我要么专门为键盘或其他东西实现另一种方法。

我现在怀疑文本子系统可能负责执行操作。但是,没有我能找到的文件!此外,执行操作时不会调用任何UITextInput委托方法。我几乎认为解决方案是私有的,我需要特别询问Apple如何访问这些功能(我刚刚完成)。

更新

positionFromPosition:inDirection:offset:是用于检测何时按下箭头键的方法。在iOS调用此方法之后,它调用setSelectedText:。你需要解决剩下的管道问题。

更新2:

我能够回答所有问题。请参阅标记的解决方案以获取答案。

2 个答案:

答案 0 :(得分:5)

想出来。我已经实现了UIMenuController方法来支持剪切,复制和粘贴。通过实现这些功能将蓝牙键盘连接到物理设备,您将自动获得基本命令选项(a,c,x,v和朋友)。您需要完全实现UIMenuController UIResponderStandardEditActions。我想要注意的是,在iOS模拟器中它将触发命令(a,c,x,v和friends)动作。当蓝牙键盘连接到物理设备时,我能够观察到的这些功能 - 即使在模拟器中启用了“模拟硬件键盘”。

关于控制/选项键;当您完全实现UITextInput时,您还将获得使用箭头键,箭头键+控件,箭头键+选项等时的所有移动功能。查看Apple提供的SimpleTextInput示例代码文件,以便更好地了解如何实现此功能

话虽如此,您可以创建自己的键盘组合。如果我想要这些功能,Apple会让我为它创建一张票,我不这样做......我真的不在乎支持他们所提供的东西。因此,目前无法执行Command + s(保存)等命令。

一个有趣的小故事; Apple说我想做的事情不可能(使用命令+ c,命令+ v等)与API。我想这表明你对他们的技术专长有何帮助。 非常令人失望。

<强>更新

自从iOS 7以来,Apple已经无法捕获任何关键命令,esc等。以下是一个如何捕获各种不同键的示例:

return @[[UIKeyCommand keyCommandWithInput:UIKeyInputEscape modifierFlags:0 action:@selector(escapeKeyPressed:)],
         [UIKeyCommand keyCommandWithInput:@"f" modifierFlags:UIKeyModifierCommand action:@selector(commandFindPressed:)],
         [UIKeyCommand keyCommandWithInput:@"s" modifierFlags:UIKeyModifierCommand action:@selector(commandSavePressed:)],
         [UIKeyCommand keyCommandWithInput:@"b" modifierFlags:UIKeyModifierControl action:@selector(controlBKeyPressed:)],
         [UIKeyCommand keyCommandWithInput:@"f" modifierFlags:UIKeyModifierControl action:@selector(controlFKeyPressed:)],
         [UIKeyCommand keyCommandWithInput:@"r" modifierFlags:UIKeyModifierControl action:@selector(controlRKeyPressed:)]
         ];
...

- (void)commandSavePressed:(UIKeyCommand *)keyCommand
{
    [self saveFile];
}

答案 1 :(得分:0)

遗憾的是,没有方法可以使用公共API执行此操作。我使用无线键盘和我的ipad,所以我之前看过这个。但是,如果您不介意使用选项键而不是命令键,则可以实施解决方法。

假设您正在创建应用程序的文本编辑器类型,您可以这样做:在键入每个字符时对其进行轮询,并使用switch语句将其与某些“特殊功能字符”进行比较。当用户在按下选项时键入键时,会插入特殊字符(例如“,»,ü等)。只需找到这些字符的unicode值,并在按下其中一个键时执行一个特定的操作。另外,请注意除了选项键之外,保持移位如何输出不同的字符。