2012-10-25 49 views
15

我正在加载模态中的UIWebView。该网页的某些输入可以完全按照iOS 5中的预期工作。但是,在iOS 6中,只要输入获得焦点,键盘就会自动“对中”表单,即使输入有足够的空间可以显示在上面键盘。由于某些输入位于页面的顶部,因此这会迫使它们不在视图中,因此用户看不到他们正在输入的内容。向后滚动以查看输入将导致键盘停止工作,直至解散并重新对焦输入(再次将其重新移出视图)。这是iOS 6的预期行为吗?有什么方法可以保持webview在输入获得焦点时滚动(比如iOS 5的工作方式)?UIWebView仅在输入焦点iOS 6上向下滚动

+0

你的UIWebView的框架是什么? – Jessedc

+0

你能给我的链接/网址你在网络视图中打开。这样我可以更好地理解你的问题。 – Swati

回答

11

不知道代码的内部工作原理,我会尽力提供帮助。如果没有别的,我希望提供一些思考的食物。你问了两个问题:

它是否预计在iOS6中的行为?

你所看到的确实很奇怪。奇怪的是,webView是集中表单而不是集中输入字段。它绝对不应该导致活动的输入字段向外滚动。此外,键盘似乎停止工作,这很奇怪。但是,在iOS 5和iOS 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 

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

+0

谢谢,非常全面。根据你的例子,我能够让事情发挥作用。 – Yeti42

+0

无法在iOS 7上工作。 – Dmitry

+0

我已经花了数小时在我的应用程序中解决这个问题,并且您的解决方案终于解决了它。非常感谢! –

0

一种解决方法可以禁用滚动在这一个UIWebView:

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

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

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

+0

设置scrollEnabled只能防止用户滚动,而不是键盘系统滚动 –

+0

好吧知道了,谢谢您的反馈 – dulgan

0

对这个职位的检查答案有你的答案: How to make a UITextField move up when keyboard is present?

总之,你需要拉升含有正在推出的针对输入的视图。该文章还包含如何做到这一点的示例代码。

希望这会有所帮助。

+0

这个问题是关于webView的具体问题。 UITextField和网页中的表单输入字段之间存在主要区别。您引用的帖子不适用于webViews。 –

相关问题