Cordova/Phonegap 3.4.0 iOS 7.1 - Проблема с клавиатурой/веб-просмотром
Я борюсь с этой проблемой уже более недели и буду очень благодарен за любую помощь, которую я могу получить. Я объясню вопрос, насколько я понимаю, но, пожалуйста, исправьте, если я скажу что-нибудь неправильное.
В iOS 7.0.x, когда клавиатура стала отображаться, веб-просмотр был изменен таким образом, что область, занятая клавиатурой, не считалась частью размера окна видового экрана. До 7.0 плагин Cordova Keyboard обрабатывал это изменение размера веб-страницы. Так как 7.0 изначально обработали клавиатуру раскрыть желаемым образом, опция Keyboard shrinkView
для файла config.xml
стала "No-op" по сравнению с этой фиксацией:
https://github.com/apache/cordova-plugins/commit/20215013bf91b659b73d5f428ae91dd58be1273a
Однако в 7.1 область, занимаемая клавиатурой, появляется поверх веб-представления. Это имеет болезненный побочный эффект. Предположим, вы хотите добавить <div>
к телу с областью textarea (например, оставить комментарий или ответ чата), т.е.
<body>
<div id="app">...</div>
<div id="reply">
<textarea></textarea>
</div>
</body>
пример CSS:
body {
position: fixed;
top: 0;
bottom: 0;
right: 0;
left: 0;
overflow: hidden;
}
#reply {
position: absolute;
bottom: 0;
left: 0;
right: 0;
}
Всякий раз, когда вы фокусируете или вводите текст в текстовое поле, веб-просмотр будет перенастроить поле ввода. Поскольку веб-представление по-прежнему учитывает всю высоту экрана, div не будет оставаться фиксированным на дне и, таким образом, разбивает макет.
Я пробовал следующие вещи:
-
Futzing с CSS для тела и фиксированным div. Позиция фиксированная/абсолютная не имеет значения. Установка явной высоты для тела ничего не делает.
-
Все возможные комбинации параметров мета-просмотра. Это то, что я сейчас использую:
<meta name="viewport" content="user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1, width=device-width, height=device-height, minimal-ui" />
-
Разоружение "No-op" в плагине клавиатуры cordova. Это все еще нарушает компоновку, как в iOS 7.0.x.
-
Наличие прослушивателей событий JS в событиях input
и focus
, чтобы продолжить вычисление нижнего смещения, чтобы сохранить div внизу. Это очень скачкообразно, потому что он борется с поведением собственного веб-представления центрирования поля ввода.
-
Изменение метатега для установки явной высоты после показа/скрытия клавиатуры.
Я использую Cordova 3.4.0-0.1.3
Кто-нибудь еще испытал эту проблему? Любые решения или идеи?
Ответы
Ответ 1
Быстрое исправление для меня включало принуждение окна к прокрутке назад в позицию, когда вход теряет фокус:
$("input").on('blur',function(){
//set brief timeout to let window catch up
setTimout(function(){
//reposition at top left corner of screen
window.scrollTo(0,0);
},20);
});
Надеюсь, что это поможет!
Ответ 2
Похоже, что у Ionic есть многопартийное решение этой проблемы, которое включает динамическое обновление тега meta viewport в зависимости от устройства, а также подключение к клавиатуре hide/show event, а затем использование их рамки прокрутки для прокрутки ввода в представлении.
Подробнее здесь..
http://ionicframework.com/blog/ionic-keyboard/
Это требует от вас использования их фреймворка, поэтому я переношу это на JQuery и IScroll, и я буду держать вас в курсе моих успехов.
Я также разместил свой опыт работы с клавиатурой phonegap на форуме phonegap, но пока не получил ответа.
https://groups.google.com/forum/#!topic/phonegap/LE9-lIsNT2c
Ответ 3
Я испытываю несколько схожую проблему. У меня есть приложение cordova 3.3.0 в сочетании с Sencha Touch.
Проблема, с которой я столкнулся, до того, как iOS 7.0 состояла в том, что строка заголовка вышла за верх экрана, когда клавиатура подошла. Клавиатура просто использовала для увеличения всего окна просмотра. После большого поиска и тяжелой работы я смог частично исправить проблему, выполнив анимацию счетчика, чтобы переместить панель заголовка вниз, когда клавиатура поднималась, используя события фокуса и размывания текстового поля.
iOS 7.0 стал счастливым сюрпризом, поскольку он исправил эту проблему изначально. Я прокомментировал мое исправление (к счастью, не удалял), и строка заголовка оставалась неподвижной наверху без каких-либо дополнительных усилий.
Кажется, iOS 7.1 вернул это исправление (интересно, почему?). Когда я обновился до iOS 7.1, проблема с заголовком вернулась, и теперь у меня нет выбора, кроме как раскомментировать неуклюжие исправления. Может ли кто-нибудь дать какое-нибудь лучшее или постоянное решение для решения этой проблемы?
Ответ 4
Помогает ли это решить вашу проблему?
Проверьте свои метатеги html на что-то вроде этого:
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0">
Замените это следующим образом:
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0, target-densityDpi=device-dpi" />