【问题标题】:Hide shortcut keyboard bar for UIWebView in iOS 9在 iOS 9 中隐藏 UIWebView 的快捷键栏
【发布时间】:2015-12-21 00:16:58
【问题描述】:

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

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

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

我怎样才能完全摆脱快捷栏。

感谢您的帮助!


*** 更新 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" />

P.S 我的应用现在正在审核中。仍然不知道苹果是否会批准这个。


*** 更新 2 ***

我的应用获得了 Apple 的批准

【问题讨论】:

  • 你不能,是网络视图的一部分。 Phonegap/Cordova 只是使用 HTML 来构建它的你的 ui,然后它在 web 视图中呈现。
  • 感谢您的回复,rckoenes。但是为什么我仍然可以隐藏撤消/复制/粘贴按钮?
  • 尽量不要将输入字段放在表单中
  • @jcesarmobile 感谢您的回复。不幸的是,不将输入放在表单中没有帮助。
  • @rubanbs,你把代码放在了哪个类?我试着把它放在 MainViewController.m 中,但它不起作用。断点命中并且代码可以正常执行。但是,do 和 undo 仍然在我的键盘上显示和工作。

标签: ios objective-c cordova uiwebview


【解决方案1】:

使用方法 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

【讨论】:

  • 这行得通!谢谢。你认为苹果会不会批准这个?
  • 是的,它得到了苹果的认可。
  • 我很好奇是否有人因此被拒绝? Telerik 键盘插件删除了此功能,因为“它使用了所谓的‘私有 API’,Apple 现在在审查您的应用程序时拒绝该 API”。 plugins.telerik.com/cordova/plugin/keyboard
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 2015-12-12
相关资源
最近更新 更多