iOS 在 UIWebBrowserView 上以编程方式禁用 Quicktype 键盘
Posted
技术标签:
【中文标题】iOS 在 UIWebBrowserView 上以编程方式禁用 Quicktype 键盘【英文标题】:iOS disable Quicktype Keyboard programmatically on UIWebBrowserView 【发布时间】:2015-08-06 11:39:46 【问题描述】:我正在为 ios 开发 PhoneGap 应用程序,我需要禁用键盘上的自动预测文本。
我为UITextView
找到了很多解决方案,例如:
Disable iOS8 Quicktype Keyboard programmatically on UITextView
ios8 xcode how to remove QuickType on UIKeyboard ( auto complete / auto suggest )
...但是PhoneGap 应用程序内部有UIWebBrowserView
。
我还知道用于禁用自动预测的 html 属性。它们仅适用于常规 html 输入,但我的 UIWebBrowserView
上有 contenteditable
元素,这是文本编辑器的可编辑区域(在我的情况下为 CKEditor)。
<!-- Does not work -->
<div contenteditable="true" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false">
</div>
那么,有没有办法在 iOS 上以编程方式禁用 contenteditable 元素的自动预测功能?
非常感谢任何帮助!
【问题讨论】:
你找到解决办法了吗? 在 contenteditable 元素上不可能 @Robin 尚未找到解决方案。但由于此功能对于应用程序至关重要,因此我们使用复杂的解决方法 - 创建本机文本编辑器(适用于 iOS 的 RichTextEditor)并将其绘制在 WebView 上方。当应用程序的某些部分应该高于原生编辑器(例如模式对话框)时,我们将原生编辑器替换为填充原生编辑器内容的div
元素。
【参考方案1】:
我最近在托管 UIWebView 的本机应用程序(不是 PhoneGap)中遇到了这个问题,并且无法通过更改 HTML 来解决它。我建议向 Apple 提交错误。
我能够通过一个相当复杂的方案强制键盘显示 sans QuickType,我确信它不会通过 App Store 指南:
1) 留意UIKeyboardWillShowNotification
通知
2) 当键盘出现时,找到第一响应者 - 这将是 UIWebView
内的一些视图
3) 动态子类化此视图以提供textInputTraits
方法的替代实现(返回符合UITextInputTraits
的对象)。将此返回对象上的autocorrectionType
设置为UITextAutocorrectionTypeNo
。
4) 在第一响应者视图中调用 reloadInputViews
- 两次。
我知道这一切不太可能帮助您或解决您的具体问题,但也许会对某人有所帮助。
【讨论】:
【参考方案2】:我发现的唯一方法是使用私有 API:
UIWebBrowserView *browserView = _myBrowserView;
NSString *spellChecking =@"setContinuousSpellCheckingEnabled:";
SEL enableSpellCheckingSelector = NSSelectorFromString(spellChecking);
NSMethodSignature* signature = [[browserView class] instanceMethodSignatureForSelector:enableSpellCheckingSelector];
if (!signature)
return;
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setTarget:browserView];
[invocation setSelector:enableSpellCheckingSelector];
[invocation setArgument:&enabled atIndex:2];
[invocation invoke];
它适用于 iOS7 和 iOS8。
但是,使用这种技巧可能无法通过 Apple 的审核。
【讨论】:
【参考方案3】:方法调配可能会有所帮助。
1.创建分类:UITextView+CloseQuickType.h & UITextView+CloseQuickType.m
2.下载jrswizzle at github
3.UITextView+CloseQuickType.m:
#import "UITextView+CloseQuickType.h"
#import <objc/runtime.h>
#import "JRSwizzle.h"
@implementation UITextView (CloseQuickType)
+ (void)load
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
//exchange init methods
[self jr_swizzleMethod:@selector(init) withMethod:@selector(init_) error:nil];
[self jr_swizzleMethod:@selector(initWithFrame:) withMethod:@selector(initWithFrame_:) error:nil];
[self jr_swizzleMethod:@selector(initWithCoder:) withMethod:@selector(initWithCoder_:) error:nil];
);
#pragma mark - myInitMethods
- (instancetype)init_
self = [self init_];
if (self)
self.autocorrectionType = UITextAutocorrectionTypeNo;
return self;
- (instancetype)initWithFrame_:(CGRect)frame
self = [self initWithFrame_:frame];
if (self)
self.autocorrectionType = UITextAutocorrectionTypeNo;
return self;
- (instancetype)initWithCoder_:(NSCoder *)aDecoder
self = [self initWithCoder_:aDecoder];
if (self)
self.autocorrectionType = UITextAutocorrectionTypeNo;
return self;
@end
4.运行应用程序。
PS:我试过了
[[UITextView appearance] setAutocorrectionType:UITextAutocorrectionTypeNo];
更改默认设置但在 Xcode7、ios9 中崩溃。
【讨论】:
以上是关于iOS 在 UIWebBrowserView 上以编程方式禁用 Quicktype 键盘的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 13 上以编程方式滚动 SwiftUI ScrollView
在 iOS 7 上以编程方式安装 .mobileconfig 文件