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

Yet*_*i42 15 objective-c uiwebview ios ios6

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

Ed *_*hin 11

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

它是iOS6中的预期行为吗?

你所看到的确实很奇怪.令人奇怪的是,webView使表单居中,而不是以输入字段为中心.它绝对不应该导致活动输入字段滚出视图.此外,键盘似乎停止工作,这是非常奇怪的.但是,对于webView滚动,预计会在iOS 5和6中看到不同的行为.正如你所说,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
Run Code Online (Sandbox Code Playgroud)

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

我花了一些时间来编写这个滚动修改代码.您可以使用它作为参考,使您自己的滚动行为在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
Run Code Online (Sandbox Code Playgroud)

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