即使连接了硬件键盘也显示 iPhone 软键盘

Posted

技术标签:

【中文标题】即使连接了硬件键盘也显示 iPhone 软键盘【英文标题】:Show iPhone soft keyboard even though a hardware keyboard is connected 【发布时间】:2011-03-20 13:32:52 【问题描述】:

我的 iPad 应用程序使用充当硬件键盘的外部“设备”。但是,在设置中的某些时候,我需要输入文本并且我不能使用“设备”(“设备”不是键盘)。 那么,即使我连接了硬件键盘,有没有办法强制弹出软键盘?

【问题讨论】:

【参考方案1】:

是的。当用户将蓝牙扫描仪“键盘”与设备配对时,我们已经在我们的一些应用程序中做到了这一点。你可以做的是确保你的 textField 有一个 inputAccessoryView ,然后自己强制 inputAccessoryView 的框架。这将导致键盘显示在屏幕上。

我们在 AppDelegate 中添加了以下两个函数。 'inputAccessoryView' 变量是我们在应用委托中声明的 UIView*:

//This function responds to all textFieldBegan editing
// we need to add an accessory view and use that to force the keyboards frame
// this way the keyboard appears when the scanner is attached
-(void) textFieldBegan: (NSNotification *) theNotification

    UITextField *theTextField = [theNotification object];
    //  NSLog(@"textFieldBegan: %@", theTextField);

    if (!inputAccessoryView) 
        inputAccessoryView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, navigationController.view.frame.size.width, 1)];
    

    theTextField.inputAccessoryView = inputAccessoryView;

    [self performSelector:@selector(forceKeyboard) withObject:nil afterDelay:0];


//Change the inputAccessoryView frame - this is correct for portrait, use a different
// frame for landscape
-(void) forceKeyboard

    inputAccessoryView.superview.frame = CGRectMake(0, 759, 768, 265);

然后在我们的 applicationDidFinishLaunching 中,我们添加了这个通知观察者,这样我们就可以在文本字段开始编辑时收到一个事件

    //Setup the textFieldNotifications
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldBegan:) name:UITextFieldTextDidBeginEditingNotification object:nil];

希望有帮助!

【讨论】:

嗨,Brian,首先非常感谢您的解决方案。不幸的是,我在多次调用键盘后遇到了键盘冻结或整个应用程序崩溃的问题。你有同样的问题,或者更好的解决方案吗? :-) 谢谢 不,我们根本没有看到这种情况发生。我们已经在数十个广泛使用贸易展览的应用程序中使用了此代码,到目前为止还没有人提到过这种类型的问题。 尽管我尽了最大的努力,但我一直遇到同样的问题 - 一定是与我的一些其他代码相互依赖,因为代码在不同的应用程序中运行完美。再次感谢您的努力! 非常感谢您的解决方案!我希望在 UIWebView 中使用它。我只需要在 UIWebView 的子视图中搜索第一响应者,并替换其 inputAccessoryView 的超级视图的框架,它就可以工作了! :) @BrianRobbins 你能帮我解决 ios 8 及更高版本的问题吗?我已经实现了相同的解决方案,但超级视图(键盘)的框架没有改变。可能是由于自动布局或其他原因。【参考方案2】:

目前的 SDK 无法做到这一点。请通过the Bug Reporter 告知 Apple。

【讨论】:

【参考方案3】:

此处的解决方案不适用于 iOS 13 或与 App Store 不兼容,因此我通过创建自己的软键盘解决了该问题。这是非常基本的但有效。随意贡献!

Project on Github

您所要做的就是将 SoftKeyboardView.swift 添加到您的项目中并在某个地方(例如 appDidFinishLaunching)点击单例:

用法:

SoftKeyboardManager.shared.disabled = false

【讨论】:

这个项目怎么用? 感谢您的提问,@YonathanGoriachnick。我刚刚更新了答案和项目,并简要说明了如何使用 非常感谢【参考方案4】:

由于我有同样的问题,我找到的最接近的解决方案是使用 Erica Sadun 的名为 KeysPlease 的应用程序,该应用程序可通过 cydia 和 modmyi 获得。它的描述是“即使连接到 BT kb 也使用软 kb。”。

此外,我发现如果您还连接了物理键盘,在我的情况下,通过 iPad 键盘文档,您可以使用似乎映射到蓝牙键盘上的弹出键的键来调出键盘。也许有办法注入这个键,就好像它是在连接的键盘上按下一样?

我真的希望有一个更官方的编码解决方案。

【讨论】:

【参考方案5】:

当我的应用程序连接蓝牙设备时,键盘不会显示。我尝试设置强制 inputAccessoryView 的框架,如 Brian Robbins 所说。没用。

然后我用一个愚蠢的方法来解决。我发现当我再次单击textfield或textview时,键盘会显示。 所以我只需要在textfield或textview中模拟一次触摸,就可以了。

如果您想进行一些模拟触摸,请选中此项。 https://github.com/HUYU2048/PTFakeTouch

【讨论】:

以上是关于即使连接了硬件键盘也显示 iPhone 软键盘的主要内容,如果未能解决你的问题,请参考以下文章

软键盘显示与隐藏的监听

联想手机A65打电话时不显示软键盘怎么设置出来?

在 Toast 下保留软键盘 - ANDROID

Android 软键盘控制方法以及开发中遇到的一些问题。

vue 软键盘采坑

Android软键盘弹出和收回监听