我正在开发一个从服务器加载PDF文件的应用程序,并在PDFView中显示这些PDF文件。这些文件包含用户要键入的表单字段。这很好用。 PDF文件将用于教育设置,其中拼写不应自动修正,预测文本不可用。
我还没有找到在PDF视图中按照UITextField中 autocorrectionType = false 的行禁用自动更正的方法。
我知道用户可以在设备设置中手动禁用自动更正和预测文本。在这种情况下,这不是一个可行的选择(可能是用户混淆,无法验证)。如果有办法在应用程序范围内禁用自动更正,我很好。
我们正在内部创建PDF文件,所以如果我们可以在生成文件时做些什么,我们就可以了。 Adobe Acrobat是表单字段上的“检查拼写”选项,但该设置无效,至少在PDFView中。
感谢。
答案 0 :(得分:0)
我找到了解决方案。这是一个黑客,但我会采取我能得到的。
我发现当用户点击PDF文本字段时,PDFKit会隐藏PDF文本字段并在同一位置覆盖UITextView。它使UITextView成为第一个响应者并调出键盘。 UITextView保持不变,直到用户点击其他地方,当它被删除并替换为包含(现在已死)UITextView内容的PDF文本字段时。
有问题的UITextView深埋在PDFView的私有UIView子类中。
以下是我正在使用的代码。它以视图(PDFView)和深潜开始,寻找它可以找到的任何UITextView。找到后,它将作为第一响应者辞职,更改参数,并再次成为第一个响应者。用户将看到先前按钮出现短暂然后消失。我还没有找到解决方法,因为我们无法访问UITextView,直到它已经是第一个响应者。
此处的代码通过每0.1秒执行一次的定时器调用。我确信有更有效的方法可以做到这一点,但这很有效,而且几乎没有在CPU计量器上注册。
此代码还设置了UITextView的pasteDelegate,因为在我的情况下,我想覆盖并防止将文本粘贴到UITextView中。这样做的代码很简单;在textPasteConfigurationSupporting
中只需返回[item setNoResult]
。
与所有类似的黑客一样,请务必使用您的应用支持的所有iOS版本进行测试 - 包括未来版本。 Apple可以很容易地改变他们的PDFKit实现,导致这种情况破裂或行为不端。或者更好的是,他们可以添加一种支持的手段来实现这一目标。
-(void)lookForTextViewsInView:(UIView *)view
for (UIView *subview in view.subviews) {
if ([subview isKindOfClass:[UITextView class]]) {
UITextView *textView = (UITextView *)subview;
//NSLog(@"Found text field with contents: %@",textView.text);
if (textView.autocapitalizationType == UITextAutocapitalizationTypeNone &&
textView.autocorrectionType == UITextAutocorrectionTypeNo &&
textView.spellCheckingType == UITextSpellCheckingTypeNo &&
textView.pasteDelegate == self) {
//NSLog(@"textView %@ is already adjusted", textView.text);
return;
}
if (textView.isFirstResponder) {
//NSLog(@"Adjusting and resetting first responder of %@",textView.text);
[textView resignFirstResponder];
textView.autocapitalizationType = UITextAutocapitalizationTypeNone;
textView.autocorrectionType = UITextAutocorrectionTypeNo;
textView.spellCheckingType = UITextSpellCheckingTypeNo;
textView.pasteDelegate = self;
[textView becomeFirstResponder];
} else {
//I don't think this ever fires, but here for completion's sake
//NSLog(@"Adjusting without resetting first responder of %@",textView.text);
textView.autocapitalizationType = UITextAutocapitalizationTypeNone;
textView.autocorrectionType = UITextAutocorrectionTypeNo;
textView.spellCheckingType = UITextSpellCheckingTypeNo;
textView.pasteDelegate = self;
}
} else {
//NSLog(@"%@ is not a UITextView", [subview class]);
[self lookForTextViewsInView:subview];
}
}
}