Задайте содержимое UIWebView не для перемещения, когда отображается клавиатура

Я провел достаточно много исследований, но не смог найти ответ на мой вопрос.

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

Вопрос: как отключить эту функцию webView или каким-то образом сделать контент не прокруткой вверх.???

Спасибо, любая помощь будет оценена.

Ответ 1

Если вы хотите отключить ВСЕ прокрутку, включая автоматическую прокрутку, когда вы перемещаетесь между полями формы, установка webView.scrollView.scrollEnabled=NO не совсем охватывает все. Это останавливает обычную прокрутку прокрутки и перетаскивания, но не автоматическую прокрутку в полевых условиях при навигации по веб-форме.

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

Здесь, как предотвратить ВСЕ прокрутку в три простых шага:

1) После создания UIWebView отключите обычную прокрутку:

myWebView.scrollView.scrollEnabled = NO;

2) Затем зарегистрируйте контроллер вида в качестве делегата scrollView:

myWebView.scrollView.delegate = self;

(И не забудьте добавить <UIScrollViewDelegate> в определение класса @interface для предотвращения предупреждений компилятора)

3) Захват и отмена всех событий прокрутки:

// UIScrollViewDelegate method
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    scrollView.bounds = myWebView.bounds;
}

Ответ 2

Я думаю, этот класс должен помочь с вашей проблемой. Он прокручивает содержимое вверх, поэтому, если у вас есть текстовое поле в нижней части экрана, оно будет перемещаться над клавиатурой.

Ответ 3

Я нашел решение для меня. Я просто прокручиваю его снова после прокрутки. Сначала я узнаю уведомление UIKeyboardWillShowNotification, добавив к нему наблюдателя [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; затем реализуем метод:

-(void)keyboardWillShow:(NSNotification*)aNotification{
NSDictionary* info = [aNotification userInfo];
float kbHeight = [[NSNumber numberWithFloat:[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size.height]floatValue];
float kbWidth = [[NSNumber numberWithFloat:[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size.width]floatValue];
BOOL keyboardIsVisible=[self UIKeyboardIsVisible];
//Check orientation and scroll down webview content by keyboard size
if(kbWidth==[UIScreen mainScreen].bounds.size.width){
    if (!keyboardIsVisible) {
        [[chatView scrollView] setContentOffset:CGPointMake(0, -kbHeight+10) animated:YES];
    } //If is landscape content scroll up is about 113 px so need to scroll down by 113
}else if (kbHeight==[UIScreen mainScreen].bounds.size.height){
    if (!keyboardIsVisible) {
        [[chatView scrollView] setContentOffset:CGPointMake(0, -113) animated:YES];
    }
}
}

Это не то, что я точно спросил, но помог мне решить мою проблему.

Спасибо.

Ответ 4

Первоначально я пытался остановить увеличение моего веб-просмотра, когда фокусировалось поле ввода (в моем случае это раздел комментариев). Весь вид увеличится автоматически и выкинет все из строя. Мне удалось сделать это с этим, и в то же время я получил веб-представление, чтобы перестать прокручивать вверх и в сторону софт-клавиатуры:

//Stop the webview from zooming in when the comments section is used.
UIScrollView *scrollView = [_webView.subviews objectAtIndex:0];
scrollView.delegate = self;

//_webView.scrollView.delegate = self; //for versions newer than iOS5.