15

我正在以模式加载 UIWebView。该网页的一些输入与 iOS 5 中的预期完全一样。但是在 iOS 6 中,只要输入获得焦点,键盘就会自动将表单“居中”,即使输入有足够的空间显示在上面键盘。由于某些输入位于页面顶部,这会迫使它们离开视图,因此用户无法看到他们正在输入的内容。向上滚动以查看输入会导致键盘停止工作,直到关闭并重新聚焦输入(进而再次将其滚动到视野之外)。这是 iOS 6 中的预期行为吗?当输入获得焦点时(如 iOS 5 的工作方式),有什么方法可以防止 webview 滚动?

4

3 回答 3

11

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

它是 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

如果此代码对您有所帮助,您将非常高兴将赏金奖励给我。我将不胜感激。

于 2013-02-27T04:41:37.677 回答
0

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

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

另一个可能是设置此滚动视图的 UIEdgeInsets,但我对此知之甚少。

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

于 2013-02-22T08:05:33.220 回答
0

这篇文章的选中答案有你的答案: How to make a UITextField move up when keyboard is present?

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

希望这可以帮助。

于 2013-02-25T21:41:48.193 回答