我正在以模式加载 UIWebView。该网页的一些输入与 iOS 5 中的预期完全一样。但是在 iOS 6 中,只要输入获得焦点,键盘就会自动将表单“居中”,即使输入有足够的空间显示在上面键盘。由于某些输入位于页面顶部,这会迫使它们离开视图,因此用户无法看到他们正在输入的内容。向上滚动以查看输入会导致键盘停止工作,直到关闭并重新聚焦输入(进而再次将其滚动到视野之外)。这是 iOS 6 中的预期行为吗?当输入获得焦点时(如 iOS 5 的工作方式),有什么方法可以防止 webview 滚动?
3 回答
在不了解您的代码的内部工作原理的情况下,我将尽我所能提供帮助。如果不出意外,我希望能提供一些思考。你问了两个问题:
它是 iOS6 中的预期行为吗?
你所看到的肯定很奇怪。奇怪的是,webView 是居中表单而不是居中输入字段。它绝对不应该导致活动输入字段滚动到视图之外。此外,键盘似乎停止工作,这很奇怪。但是,预计在 iOS 5 和 6 中会看到关于 webView 滚动的不同行为。正如您所说,iOS 5 将 inputField 滚动到视图中,而 iOS6 将其置于中心位置。
当输入获得焦点时(如 iOS 5 的工作方式),有什么方法可以防止 webview 滚动?
是的。我在下面提供了执行此操作的代码——即阻止 webView 滚动。如果这正是您想要做的,那就太好了。但是,停止滚动 webView 与获得与 iOS5 相同的行为不同。尽管如此,我还是想按照您的要求为您提供此选项。
#import "ViewController.h"
@interface ViewController () <UIScrollViewDelegate> {
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 () <UIScrollViewDelegate> {
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];
另一个可能是设置此滚动视图的 UIEdgeInsets,但我对此知之甚少。
我认为这是 iOS 5 和 6 中的标准行为,滚动以使输入字段位于键盘顶部(就像 Safari 一样)。
这篇文章的选中答案有你的答案: How to make a UITextField move up when keyboard is present?
简而言之,您需要向上移动包含被推出视图的输入的视图。该帖子还包含有关如何执行此操作的示例代码。
希望这可以帮助。