阻止UIWebView重新定位输入字段

时间:2011-12-13 19:18:04

标签: javascript jquery ios ipad uiwebview

我有一个iPad应用程序,我在其中将输入表单显示为UIPopoverController中的UIWebView。我的弹出控制器的大小使得在键盘出现时不必调整大小。

当我点击UIWebView中的输入字段时,当键盘出现时,Web视图会被进一步向上推。它被推到文本字段位于框架顶部的点。 (这是您在移动Safari中使用表单时看到的标准行为)。

在键盘启动之前,webview根本不会滚动,但一旦完成,(如第二张图片所示)我可以将webview向下滚动到正确的位置。

因为我的webview已经正确调整大小,所以我不希望出现这种情况。有没有人对如何防止这种情况有任何建议? (此处不使用网页视图目前不是一种选择)

谢谢!

View without keyboard View with keyboard

2 个答案:

答案 0 :(得分:3)

  1. UIKeyboardWillShowNotification

    中将NSNotificationCenter添加到viewDidLoad
    [[NSNotificationCenter defaultCenter] addObserver:self 
        selector:@selector(keyboardWillShow:) 
        name:UIKeyboardWillShowNotification object:nil];
    
  2. 实现keyboardWillShow:和readjustWebviewScroller方法

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

答案 1 :(得分:0)

我不是Objective-C程序员(事实上我根本不了解Objective-C :-),但我也需要这样做(在我的Web应用程序中运行在WebView上的iPad),所以在谷歌的“小”帮助下我做到了这一点:

- (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)我想有可能覆盖UIScrollView类的setContentOffset方法并实现自己的行为(并且可能调用父类的超级方法)。 / p>