在iOS 9中,如何隐藏UIWebView的快捷键盘栏?

8

我正在开发iOS的PhoneGap应用程序,需要去掉新的iOS 9快捷栏。现在我正在- (void)viewDidLoad方法中执行以下操作:

if ([self.webView respondsToSelector:@selector(inputAssistantItem)]) {
    UITextInputAssistantItem *inputAssistantItem = [self.webView inputAssistantItem];
    inputAssistantItem.leadingBarButtonGroups = @[];
    inputAssistantItem.trailingBarButtonGroups = @[];
}

这会隐藏撤销/重做和复制/粘贴按钮,但是快捷栏仍然显示在键盘上,并且其中有导航按钮。

enter image description here

我该如何完全摆脱快捷栏。

感谢您的帮助!


***更新1***

我的完整工作代码如下。 希望这可以帮助某些人(感谢@Clement回复)

#import <objc/runtime.h>

- (void) hideKeyboardShortcutBar: (UIView *)view
{
    for (UIView *sub in view.subviews) {
        [self hideKeyboardShortcutBar:sub];
        if ([NSStringFromClass([sub class]) isEqualToString:@"UIWebBrowserView"]) {

            Method method = class_getInstanceMethod(sub.class, @selector(inputAccessoryView));
            IMP newImp = imp_implementationWithBlock(^(id _s) {
                if ([sub respondsToSelector:@selector(inputAssistantItem)]) {
                    UITextInputAssistantItem *inputAssistantItem = [sub inputAssistantItem];
                    inputAssistantItem.leadingBarButtonGroups = @[];
                    inputAssistantItem.trailingBarButtonGroups = @[];
                }
                return nil;
            });
            method_setImplementation(method, newImp);

        }
    }
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self hideKeyboardShortcutBar:self.webView];
}

这个技巧会隐藏撤销/重做和导航按钮。但是自动预测文本仍然会显示在键盘上。要完全隐藏快捷栏,请在您的输入元素中添加HTML属性。
<input autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" />

附言:我的应用现在正在审核中。目前还不知道苹果是否会批准。


*** 更新2 ***

我的应用已经被苹果批准了。


你不能这样做,因为它是 web view 的一部分。Phonegap/Cordova 只是使用 HTML 构建其用户界面,然后在 web view 中呈现。 - rckoenes
感谢您的回复,rckoenes。但是为什么我仍然能够隐藏撤销/复制/粘贴按钮呢? - BorisR
尝试不将输入字段放在表单内。 - jcesarmobile
@CaptainSkubalon,请查看我在问题更新中的完整代码。 - BorisR
@CaptainSkubalon 在文件开头添加 #import <objc/runtime.h> 导入语句,可以解决你的错误。 - BorisR
显示剩余4条评论
1个回答

7
使用方法 swiziling,我们可以删除键盘快捷方式栏(仅适用于 ObjC)。
 - (void)hideKeyboardShortcutBar
    {
        Class webBrowserClass = NSClassFromString(@"UIWebBrowserView");
        Method method = class_getInstanceMethod(webBrowserClass, @selector(inputAccessoryView));

        IMP newImp = imp_implementationWithBlock(^(id _s) {
            if ([self.webView respondsToSelector:@selector(inputAssistantItem)]) {
                UITextInputAssistantItem *inputAssistantItem = [self.webView inputAssistantItem];
                inputAssistantItem.leadingBarButtonGroups = @[];
                inputAssistantItem.trailingBarButtonGroups = @[];
            }
            return nil;
        });

        method_setImplementation(method, newImp);
    }

inputAccessoryView: 此属性通常用于将附件视图附加到为UITextField和UITextView对象呈现的系统提供的键盘上。

所以新实现块将在每次弹出键盘时触发。

更新

要从WKWebView中删除附件视图,请使用WKContentView而不是UIWebBrowserView


这个可以用!谢谢。你觉得苹果会批准这个吗? - BorisR
是的,它已经被苹果批准了。 - Clement Prem
我很好奇是否有人因此被拒绝了?Telerik键盘插件删除了此功能,因为“它使用所谓的‘私有API’,当您的应用程序被审查时,苹果现在正在拒绝它”。http://plugins.telerik.com/cordova/plugin/keyboard - mpoisot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接