UIWebView的输入焦点iOS 6中向下滚动只(UIWebView scrolling down

2019-08-01 22:11发布

I'm loading a UIWebView in a modal. The web page has some inputs that work exactly as intended in iOS 5. However in iOS 6, anytime an input gets focus, the keyboard is doing it's automatic 'centering' of the form even though the inputs have plenty of room to be shown above the keyboard. Since some of the inputs are at the top of the page, this forces them out of view so the user cannot see what they are typing. Scrolling back up to see the inputs causes the keyboard to stop working until dismissed and refocusing the input (in turn scrolling it out of view again). Is this an expected behavior in iOS 6? Is there any way to keep the webview from scrolling when an input gains focus (like how iOS 5 works)?

Answer 1:

不知道你的代码的内部工作,我会尽力帮助像我一样可以。 如果不出意外,我希望能为想提供一些食物。 你问了两个问题:

难道是预计在iOS6的行为吗?

你看到的是肯定很奇怪。 很奇怪的是,Webview是居中的形式,而不是居中输入字段。 它绝对应该不会造成激活的输入栏中滚动拿出来看。 此外,键盘似乎停止工作,这是很奇怪的。 但是,它预计将看到不同行为的iOS 5和6关于web视图滚动。 正如你所说,iOS 5的滚动inputField进入视野,而iOS6的把它放在中心。

有没有办法从滚动保持的WebView当输入获得焦点(比如如何iOS 5的工程)?

是。 我提供的代码来做到这这下面 - 即从滚动停止web视图。 如果这正是你想做的事,再大的东西。 然而,从滚动停止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

如果这个代码帮助你,这将是非常好的,你的奖金奖励给我。 我会谦卑地感激。



Answer 2:

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

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

另一个可以设置该滚动型的UIEdgeInsets,但我不知道很多关于这一点。

我认为这是在双方的iOS 5和6标准行为的滚动,使输入字段只是TE键盘(就像Safari浏览器也)的顶部。



Answer 3:

对这个职位的检查答案有你的答案: 如何使一个的UITextField向上移动时,键盘的存在?

总之,需要向上移动含有正被压出的视图的输入的图。 该帖子还包含有关如何做到这一点的示例代码。

希望这可以帮助。



文章来源: UIWebView scrolling down on input focus iOS 6 only