我有一个iPad应用程序,我在其中将输入表单显示为UIPopoverController中的UIWebView。我的弹出控制器的大小使得在键盘出现时不必调整大小。
当我点击UIWebView中的输入字段时,当键盘出现时,Web视图会被进一步向上推。它被推到文本字段位于框架顶部的点。 (这是您在移动Safari中使用表单时看到的标准行为)。
在键盘启动之前,webview根本不会滚动,但一旦完成,(如第二张图片所示)我可以将webview向下滚动到正确的位置。
因为我的webview已经正确调整大小,所以我不希望出现这种情况。有没有人对如何防止这种情况有任何建议? (此处不使用网页视图目前不是一种选择)
谢谢!
答案 0 :(得分:3)
在UIKeyboardWillShowNotification
NSNotificationCenter
添加到viewDidLoad
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification object:nil];
实现keyboardWillShow:和readjustWebviewScroller方法
- (void)keyboardWillShow:(NSNotification *)aNotification {
[self performSelector:@selector(readjustWebviewScroller) withObject:nil afterDelay:0];
}
- (void)readjustWebviewScroller {
_webView.scrollView.bounds = _webView.bounds;
}
这对我有用。
答案 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>