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

2024-05-21

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

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

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

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

Thanks.


我找到了解决方案。这是一个黑客,但我会采取我能得到的。

我发现当用户点击 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];
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PDFView 表单字段中配置键盘设置 的相关文章

随机推荐