Phonegap: полное удаление черной полосы с клавиатуры iPhone
Мы используем Phonegap для разработки нашего мобильного приложения, и мы позаимствовали код здесь, чтобы удалить черную панель next/prev/done с клавиатуры:
qaru.site/info/245288/...
Что делает этот код, он находит черную полосу, как объект UIView, и вызывает на нем "removeFromSuperview".
Мы не знакомы с IOS SDK/API. Поэтому, хотя мы можем смотреть на код и получать представление о том, что он делает, мы не можем сказать, правильно ли он это делает или как его улучшить.
Конкретная проблема, с которой мы сталкиваемся:
У нас есть текстовое поле для написания сообщения, и мы вручную контролируем размещение этого поля точно над клавиатурой, аналогично встроенному sms-приложению. Другими словами, мы помещаем его туда, где должен был быть черный бар.
Когда мы фокусируем/вводим в поле сообщения, система подталкивает представление вверх. Похоже, что это механизм, чтобы убедиться, что текстовое поле не является невидимым, когда пользователь вводит в него.
Это происходит, даже если текстовое поле видимо.
Я заметил, что, поместив поле ввода прямо вверх, где черная полоса обычно будет (как и против нее), вид не прокручивается.
Итак, кажется, что система почему-то думает, что черная полоса все еще там!
(Чтобы дважды проверить: когда черная полоса не удаляется, и мы помещаем текстовое поле прямо над ней, мы можем сфокусироваться и ввести ее, а представление не будет прокручиваться).
Итак, вопрос:
Почему "система" подталкивает контент при редактировании текстового поля, которое стоит "сзади", где должна быть черная полоса? Это потому, что черная полоса еще не полностью удалена? Нужно ли нам что-то делать, чтобы "полностью" удалить черную полосу? Нужно ли нам заставить iOS пересчитать размер клавиатуры? или что именно?
Является ли этот механизм (нажатие на представление) реализованным iOS UIWebView или с помощью Phonegap?
Есть ли приложение для телефонных разговоров, которое решило эту проблему?
Ответы
Ответ 1
заменить
[subviewWhichIsPossibleFormView removeFromSuperview];
с
UIScrollView *webScroll = [webView.subviews lastObject];
CGRect newFrame = webScroll.frame;
float accesssoryHeight = subviewWhichIsPossibleFormView.frame.size.height;
newFrame.size.height += accesssoryHeight;
[subviewWhichIsPossibleFormView removeFromSuperview];
[webScroll setFrame:newFrame];
он изменяет размер прокрутки содержимого для количества отсутствующего вспомогательного пространства. В качестве другого кода он использует "частный API". В деталях он не использует частный API напрямую, но если Apple решит изменить вид представления (в данном случае Keyboard и WebView), то он будет разбиваться.
Например, если они переименовали UIWebFormAccessory
, ваш код больше не будет работать.
EDIT:
на iOS 5.0+ вы можете напрямую вызвать webView.scrollView
. Таким образом, вы можете разделить код на резервную копию pre iOS 5:
UIScrollView *webScroll;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 5.0) {
webScroll = webView.scrollView;
} else {
webScroll = [webView.subviews lastObject]; // iOS 2.x (?) - 4.x
// make sure this code runs appropriate on older SDKs
}
Ответ 2
Это сработало для меня: https://github.com/don/KeyboardToolbarRemover
Вам нужно будет знать, что нет файла Cordova.plist по Phonegap 2.3.0 - вместо этого отредактируйте свой файл конфигурации config со следующим:
<plugin name="KeyboardToolbarRemover" value="KeyboardToolbarRemover" />
в ветке