2012-10-25 7 views
15

Ich lade ein UIWebView in einem modalen. Die Webseite hat einige Eingaben, die in iOS 5 genau wie vorgesehen funktionieren. Wenn jedoch in iOS 6 ein Eingang scharfgestellt wird, zentriert die Tastatur automatisch das Formular, obwohl die Eingänge genügend Platz haben, um darüber angezeigt zu werden die Tastatur. Da sich einige der Eingaben oben auf der Seite befinden, sind sie nicht sichtbar, sodass der Benutzer nicht sehen kann, was er eingibt. Wenn Sie nach oben blättern, um die Eingaben zu sehen, wird die Tastatur nicht mehr funktionieren, bis Sie sie ablehnen und die Eingabe neu fokussieren (und sie anschließend erneut aus der Ansicht scrollen). Ist das ein erwartetes Verhalten in iOS 6? Gibt es eine Möglichkeit, die Webansicht vom Scrollen abzuhalten, wenn eine Eingabe den Fokus erhält (wie funktioniert iOS 5)?UIWebView Scrollen nach unten auf Eingabefokus iOS 6 nur

+0

Was ist der Rahmen Ihres UIWebView? – Jessedc

+0

Können Sie mir den Link/URL geben, was Sie in der Webansicht öffnen? Damit ich dein Problem besser verstehen kann. – Swati

Antwort

11

Ohne die inneren Abläufe Ihres Codes zu kennen, werde ich versuchen, so viel wie möglich zu helfen. Nicht zuletzt hoffe ich, etwas zum Nachdenken zu liefern. Sie haben zwei Fragen gestellt:

Ist das Verhalten in iOS6 erwartet?

Was Sie sehen, ist ziemlich merkwürdig. Es ist seltsam, dass das webView das Formular zentriert und nicht das Eingabefeld zentriert. Und es sollte auf keinen Fall dazu führen, dass das aktive Eingabefeld nicht sichtbar ist. Außerdem scheint die Tastatur zu funktionieren, was ziemlich merkwürdig ist. Es wird jedoch erwartet, dass sich das Verhalten von iOS 5 und 6 in Bezug auf das WebView-Scrollen unterscheidet. Wie du schon sagtest, scrollt iOS 5 das InputField in die Ansicht, während iOS6 es in die Mitte stellt.

Gibt es eine Möglichkeit, die Webansicht vom Scrollen abzuhalten, wenn eine Eingabe den Fokus erhält (wie funktioniert iOS 5)?

Ja. Ich stelle Code zur Verfügung, um genau das unten zu tun - nämlich, um das webView vom Scrollen zu stoppen. Wenn das genau das ist, was du machen willst, dann großartig. Es ist jedoch nicht dasselbe, das WebView vom Scrollen abzuhalten, als ob man das gleiche Verhalten wie iOS5 hätte. Trotzdem wollte ich dir diese Option geben, wie du es verlangst.

#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 

Wenn Sie konsistente Scroll-Verhalten wollen ...

nahm ich einige Zeit diese Rolle Modifikation zu codieren up. Sie können es als Referenz verwenden, um ein eigenes Scroll-Verhalten zu erstellen, das für iOS 5 konsistent ist. 6 In diesem Code: Wenn der Benutzer auf ein Texteingabefeld auf einer Webseite klickt, hält der Code das Standard-Scrollverhalten an Seite scrollte zu seiner aktuellen Position. Leider gibt es keine Möglichkeit, das gesamte Scrollen abzubrechen, sondern Scrollen zu überschreiben.Sobald das Standard-Scrolling "unterdrückt" wurde, erhält es die Position des aktiven Eingabefeldes und scrollt zu dieser Position. Dadurch wird das aktive Eingabefeld oben auf dem Bildschirm angezeigt. Sie können dies nach Ihren Wünschen ändern. Zum Beispiel können Sie [UIScrollView scrollRectToVisible] verwenden, um es mehr wie iOS5 zu machen.

Wenn dieser Code Ihnen geholfen hat, wäre es sehr nett von Ihnen, das Kopfgeld an mich zu belohnen. Ich wäre demütig dankbar.

+0

Danke, sehr gründlich. Ich konnte die Dinge basierend auf deinen Beispielen zum Laufen bringen. – Yeti42

+0

Funktioniert nicht auf iOS 7. – Dmitry

+0

Ich habe buchstäblich Stunden damit verbracht, dieses Problem in meiner App zu lösen, und Ihre Lösung hat es schließlich gelöst. Vielen Dank! –

0

konnte Eine Abhilfe die Rolle in diesem UIWebView deaktivieren werden:

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

Ein anderer die UIEdgeInsets dieser Scroll Einstellung werden könnte, aber ich weiß nicht viel über diese.

Ich denke, das ist ein Standardverhalten in iOS 5 und 6 zu scrollen, um das Eingabefeld nur auf der Oberseite der Tastatur zu machen (genau wie bei Safari).

+0

Einstellung der ScrollEnabled verhindert nur Benutzer Scrollen, nicht Tastatursystem Scrollen –

+0

Ok gut zu wissen, danke für Ihr Feedback – dulgan

0

Die geprüfte Antwort auf diesen Beitrag Ihre Antwort hat: How to make a UITextField move up when keyboard is present?

Kurz gesagt, müssen Sie die Ansicht bewegen, die Eingaben enthält, die aus der Sicht geschoben werden. Der Post enthält auch einen Beispielcode für die Vorgehensweise.

Hoffe, das hilft.

+0

die Frage bezieht sich speziell auf eine WebView. Es gibt einen großen Unterschied zwischen einem UITextField- und einem Formular-Eingabefeld innerhalb einer Webseite. Der Beitrag, den Sie referenzieren, funktioniert nicht auf WebViews. –

Verwandte Themen