在 PDFView 表单域中配置键盘设置

Posted

技术标签:

【中文标题】在 PDFView 表单域中配置键盘设置【英文标题】:Configuring keyboard settings within PDFView form fields 【发布时间】:2018-04-30 14:45:47 【问题描述】:

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

我还没有找到在 PDFView 中禁用自动更正的方法,类似于 UITextField 中的 autocorrectionType = false

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

我们正在内部创建 PDF 文件,因此如果在生成文件时我们可以做一些事情,我们可以。 Adobe Acrobat 是表单域上的“检查拼写”选项,但该设置没有效果,至少在 PDFView 中是这样。

谢谢。

【问题讨论】:

【参考方案1】:

我找到了解决方案。这是一个黑客,但我会尽我所能。

我发现当用户点击 PDF 文本字段时,PDFKit 会隐藏 PDF 文本字段并在同一位置覆盖 UITextView。它使 UITextView 成为第一响应者并调出键盘。该 UITextView 一直存在,直到用户在其他地方点击,当它被删除并替换为包含(现已失效的)UITextView 内容的 PDF 文本字段时。

有问题的 UITextView 深埋在 PDFView 的私有 UIView 子类中。

下面是我正在使用的代码。它从一个视图(PDFView)开始,然后深入寻找它可以找到的任何 UITextView。找到后,它辞去第一响应者的身份,更改参数,并再次成为第一响应者。用户将看到预输入按钮短暂出现然后消失。我还没有找到解决这个问题的方法,因为我们无法访问 UITextView,直到它已经是第一响应者。

这里的代码是通过每 0.1 秒执行一次的计时器调用的。我确信有更有效的方法可以做到这一点,但这很有效,而且几乎不会在 CPU 仪表上注册。

此代码还设置了 UITextView 的 pasteDelegate,因为在我的情况下,我想覆盖并防止将文本粘贴到 UITextView 中。执行此操作的代码很简单;在textPasteConfigurationSupporting 中只需返回[item setNoResult]

与所有类似的 hack 一样,请务必使用您的应用支持的所有 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];
    
  

【讨论】:

如果有人愿意使用它但更高效:我刚刚看到 PDFViewAnnotationHitNotification,当用户点击注释时触发的通知。我没有测试过这个,所以不能保证......

以上是关于在 PDFView 表单域中配置键盘设置的主要内容,如果未能解决你的问题,请参考以下文章

在联系表单文本区域中获取换行符以显示在电子邮件中

如何在表单文本区域中添加变量

如何在表单域中保存和恢复多个值(仅使用前端逻辑)

在 WebView 中点击表单字段不显示软键盘

使用表单助手在 Rails 的预填充文本区域中保留换行符

表单知识随记