Настройка параметров клавиатуры в полях формы 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];
}
}
}