在PDFView表单字段中配置键盘设置

时间:2018-04-30 14:45:47

标签: ios uitextfield pdfview

我正在开发一个从服务器加载PDF文件的应用程序,并在PDFView中显示这些PDF文件。这些文件包含用户要键入的表单字段。这很好用。 PDF文件将用于教育设置,其中拼写应自动修正,预测文本可用。

我还没有找到在PDF视图中按照UITextField中 autocorrectionType = false 的行禁用自动更正的方法。

我知道用户可以在设备设置中手动禁用自动更正和预测文本。在这种情况下,这不是一个可行的选择(可能是用户混淆,无法验证)。如果有办法在应用程序范围内禁用自动更正,我很好。

我们正在内部创建PDF文件,所以如果我们可以在生成文件时做些什么,我们就可以了。 Adobe Acrobat是表单字段上的“检查拼写”选项,但该设置无效,至少在PDFView中。

感谢。

1 个答案:

答案 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];
    }
  }
}