Подтвердить что ты не робот

Phonegap: полное удаление черной полосы с клавиатуры iPhone

Мы используем Phonegap для разработки нашего мобильного приложения, и мы позаимствовали код здесь, чтобы удалить черную панель next/prev/done с клавиатуры:

qaru.site/info/245288/...

Что делает этот код, он находит черную полосу, как объект UIView, и вызывает на нем "removeFromSuperview".

Мы не знакомы с IOS SDK/API. Поэтому, хотя мы можем смотреть на код и получать представление о том, что он делает, мы не можем сказать, правильно ли он это делает или как его улучшить.

Конкретная проблема, с которой мы сталкиваемся:

У нас есть текстовое поле для написания сообщения, и мы вручную контролируем размещение этого поля точно над клавиатурой, аналогично встроенному sms-приложению. Другими словами, мы помещаем его туда, где должен был быть черный бар.

Когда мы фокусируем/вводим в поле сообщения, система подталкивает представление вверх. Похоже, что это механизм, чтобы убедиться, что текстовое поле не является невидимым, когда пользователь вводит в него.

Это происходит, даже если текстовое поле видимо.

Я заметил, что, поместив поле ввода прямо вверх, где черная полоса обычно будет (как и против нее), вид не прокручивается.

Итак, кажется, что система почему-то думает, что черная полоса все еще там!

(Чтобы дважды проверить: когда черная полоса не удаляется, и мы помещаем текстовое поле прямо над ней, мы можем сфокусироваться и ввести ее, а представление не будет прокручиваться).

Итак, вопрос:

Почему "система" подталкивает контент при редактировании текстового поля, которое стоит "сзади", где должна быть черная полоса? Это потому, что черная полоса еще не полностью удалена? Нужно ли нам что-то делать, чтобы "полностью" удалить черную полосу? Нужно ли нам заставить iOS пересчитать размер клавиатуры? или что именно?

Является ли этот механизм (нажатие на представление) реализованным iOS UIWebView или с помощью Phonegap?

Есть ли приложение для телефонных разговоров, которое решило эту проблему?

4b9b3361

Ответ 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" />

в ветке