Настройка параметров клавиатуры в полях формы PDFView

Я работаю над приложением, которое загружает файлы PDF с сервера и отображает эти файлы PDF в PDFView. Файлы содержат поля формы, в которые должен вводить пользователь. Это отлично работает. Файлы PDF должны использоваться в учебных заведениях, где написание не должно быть автоматически исправлено, а прогностический текст не должен быть доступен.

Я не нашел средства для отключения автозамены в PDFView, в соответствии с autocorrectionType = false в UITextField.

Я знаю, что пользователь может вручную отключить автокоррекцию и прогнозный текст в настройках устройства. Это не жизнеспособный вариант в этом случае (вероятно, путаница пользователя и нет средств для проверки). Я в порядке, если есть способ отключить автозамену всего приложения.

Мы создаем PDF-файлы собственными силами, поэтому мы в порядке, если есть что-то, что мы можем сделать во время генерации файлов. Adobe Acrobat - это параметр "проверить орфографию" в полях формы, но этот параметр не действует, по крайней мере, в PDFView.

Благодарю.

1 ответ

Решение

Я нашел решение. Это взлом, но я возьму то, что смогу получить.

Я обнаружил, что когда пользователь нажимает на текстовое поле PDF, PDFKit скрывает текстовое поле PDF и накладывает UITextView в том же месте. Это делает UITextView первым респондентом и вызывает клавиатуру. Этот UITextView остается до тех пор, пока пользователь не коснется другого места, когда он будет удален и заменен текстовым полем PDF, содержащим содержимое (теперь уже мертвого) UITextView.

Рассматриваемый UITextView скрыт глубоко внутри PDFView, в частных подклассах UIView.

Ниже приведен код, который я использую. Он начинается с представления (PDFView) и глубокого погружения в поисках любого UITextView, который он может найти. При обнаружении он подает в качестве первого респондента, изменяет параметры и снова становится первым респондентом. Пользователь увидит, как быстро нажимаются кнопки ввода текста, а затем исчезают. Я не нашел способа обойти это, так как мы не получаем доступ к UITextView, пока он не станет первым респондентом.

Код здесь вызывается через таймер, выполняющийся каждые 0,1 секунды. Я уверен, что есть более эффективные способы сделать это, но это работает, и едва регистрируется на измерителе ЦП.

Этот код также устанавливает pasteDelegate UITextView, потому что в моем случае я хочу переопределить и предотвратить вставку текста в 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];
    }
  }
}
Другие вопросы по тегам