UIWebView仅在输入焦点iOS 6上向下滚动

我正在以模态加载UIWebView。 该网页有一些输入完全按照预期在iOS 5中工作。但是在iOS 6中,只要输入获得焦点,键盘就会自动“对齐”表单,即使输入有足够的空间显示在上面键盘。 由于某些输入位于页面顶部,因此会强制它们脱离视图,因此用户无法看到他们正在键入的内容。 向上滚动以查看输入会导致键盘停止工作,直到被解除并重新聚焦输入(然后再将其滚动到视图外)。 这是iOS 6中的预期行为吗? 当输入获得焦点时(如iOS 5的工作方式),有没有办法阻止webview滚动?

在不知道代码的内部工作原理的情况下,我会尽力帮助。 如果不出意外,我希望能提供一些思考的食物。 你问了两个问题:

它是iOS6中的预期行为吗?

你所看到的确实很奇怪。 奇怪的是,webView使表单居中,而不是以输入字段为中心。 它绝对不应该导致活动输入字段滚出视图。 此外,键盘似乎停止工作,这是非常奇怪的。 但是,对于webView滚动,预计会在iOS 5和6中看到不同的行为。 如你所说,iOS 5将inputField滚动到视图中,而iOS6将其置于中心位置。

当输入获得焦点时(如iOS 5的工作方式),有没有办法阻止webview滚动?

是。 我提供了下面的代码 – 即阻止webView滚动。 如果这正是你想要做的,那就太好了。 但是,停止滚动webView与获取与iOS5相同的行为不同。 不过,我还是想按你的要求给你这个选项。

#import "ViewController.h" @interface ViewController ()  { CGPoint origin; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]]; [self.webView loadRequest:request]; self.webView.scrollView.delegate = self; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow) name:UIKeyboardWillShowNotification object:nil]; // NOTE THAT SIMPLY DISABLING THE SCROLL WILL NOT PREVENT KEYBOARD SCROLL //[self.webView.scrollView setScrollEnabled:NO]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void)keyboardWillShow { NSLog(@"keyboard"); origin = self.webView.scrollView.contentOffset; } -(void)scrollViewDidScroll:(UIScrollView *)scrollView { NSLog(@"scroll"); [self.webView.scrollView setContentOffset:origin]; } @end 

如果你想要一致的滚动行为……

我花了一些时间来编写这个滚动修改代码。 您可以使用它作为参考,使您自己的滚动行为在iOS 5和6中保持一致。 在此代码中:当用户单击网页上的文本输入框时,代码将通过保持页面滚动到其当前位置来停止默认滚动行为。 不幸的是,没有办法取消所有滚动,而是你必须覆盖滚动。 一旦默认滚动被“抑制”,它就会获得活动输入框的位置并滚动到该位置。 这会将活动输入框置于屏幕顶部。 您可以根据自己的喜好进行修改。 例如,您可以使用[UIScrollView scrollRectToVisible]使其更像iOS5。

 #import "ViewController.h" @interface ViewController ()  { CGPoint origin; CGPoint activeElementOrigin; BOOL pauseScroll; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]]; [self.webView loadRequest:request]; self.webView.scrollView.delegate = self; pauseScroll = NO; origin = CGPointZero; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow) name:UIKeyboardDidShowNotification object:nil]; } - (void)keyboardWillShow { NSLog(@"keyboard"); pauseScroll = YES; origin = self.webView.scrollView.contentOffset; } - (void)keyboardDidShow { NSLog(@"keyboard DID SHOW"); pauseScroll = NO; [self.webView.scrollView setContentOffset:activeElementOrigin animated:YES]; } -(void)scrollViewDidScroll:(UIScrollView *)scrollView { NSLog(@"scroll"); if (pauseScroll) { [self.webView.scrollView setContentOffset:origin animated:NO]; NSString *javaScript = [NSString stringWithFormat:@"function f(){ var textField = document.activeElement; return textField.getBoundingClientRect().top; } f();"]; NSString *textFieldRectTop = [self.webView stringByEvaluatingJavaScriptFromString:javaScript]; activeElementOrigin = origin; activeElementOrigin.y = [textFieldRectTop floatValue]-10; } } @end 

如果这段代码对你有所帮助,那么奖励我的赏金将是非常好的。 我会谦卑地欣赏。

解决方法可能是禁用此UIWebView中的滚动:

 UIScrollView *scrollView = webView.scrollView; [scrollview setScrollEnabled:NO]; [scrollView bounces:NO]; 

另一个可能是设置此scrollView的UIEdgeInsets但我不太了解这一点。

我认为这是iOS 5和6中的标准行为,滚动使输入字段位于te键盘之上(就像Safari一样)。

在这篇文章中检查的答案有你的答案: 如何在键盘存在时使UITextField向上移动?

简而言之,您需要向上移动包含被推出视图的输入的视图。 该post还包含有关如何执行此操作的示例代码。

希望这可以帮助。