Запрет UIWebView для изменения положения поля ввода - PullRequest
4 голосов
/ 13 декабря 2011

У меня есть приложение для iPad, в котором я отображаю форму ввода в виде UIWebView в UIPopoverController.Мой контроллер поповера имеет такой размер, что его размер не нужно изменять при появлении клавиатуры.

Когда я нажимаю на поле ввода в UIWebView, при появлении клавиатуры веб-представление перемещается вверх.Он выдвигается до точки, в которой текстовое поле находится вверху фрейма.(Это стандартное поведение, которое вы видите при использовании форм в мобильном сафари).

Веб-просмотр вообще не прокручивается до того, как клавиатура поднята, но как только он (как видно на втором изображении), я могу прокрутить веб-просмотр обратно в правильное положение.

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

Спасибо!

View without keyboard View with keyboard

Ответы [ 2 ]

3 голосов
/ 10 февраля 2012
  1. Добавить UIKeyboardWillShowNotification к NSNotificationCenter в viewDidLoad

    [[NSNotificationCenter defaultCenter] addObserver:self 
        selector:@selector(keyboardWillShow:) 
        name:UIKeyboardWillShowNotification object:nil];
    
  2. Реализация клавиатурыWillShow: и перенастройка методов WebviewScroller

    - (void)keyboardWillShow:(NSNotification *)aNotification {
        [self performSelector:@selector(readjustWebviewScroller) withObject:nil afterDelay:0];
    }
    
    
    - (void)readjustWebviewScroller {
        _webView.scrollView.bounds = _webView.bounds;
    }
    

Это работает для меня.

0 голосов
/ 13 марта 2013

Я не программист Objective-C (на самом деле я вообще не знаю Objective-C :-), но мне тоже нужно было это сделать (в моем веб-приложении, работающем на iPad в WebView),поэтому с «маленькой» помощью Google я сделал это:

- (void)init {
    [[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(keyboardWillShow:)
     name:UIKeyboardWillShowNotification object:nil];
}

- (void)keyboardWillShow:(NSNotification *)aNotification {

    float x = self.webView.scrollView.bounds.origin.x;
    float y = self.webView.scrollView.bounds.origin.y;
    CGPoint originalOffset = CGPointMake(x, y);

    for (double p = 0.0; p < 0.1; p += 0.001) {
        [self setContentOffset:originalOffset withDelay:p];
    }
}

- (void)setContentOffset:(CGPoint)originalOffset withDelay:(double)delay {
    double delayInSeconds = delay;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [self.webView.scrollView setContentOffset:originalOffset animated:NO];
    });
}

Я знаю, что это не лучшее решение - но оно работает.С точки зрения общего программирования (я не знаю Objective-C), я думаю, что возможно будет перезаписать метод setContentOffset класса UIScrollView и реализовать ваше собственное поведение (и, возможно, вызов супер-метода родителя).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...