Sto caricando un UIWebView in modal. La pagina Web ha alcuni input che funzionano esattamente come previsto in iOS 5. Tuttavia, in iOS 6, ogni volta che un input diventa attivo, la tastiera esegue automaticamente il "centraggio" del modulo anche se gli input hanno molto spazio per essere visualizzati sopra la tastiera. Dal momento che alcuni degli input sono nella parte superiore della pagina, questo li costringe a non visualizzarli in modo che l'utente non possa vedere cosa stanno digitando. Scorrendo verso l'alto per vedere gli input, la tastiera smette di funzionare fino a quando non viene chiusa e riorienta l'input (a sua volta lo si rimuove dalla vista di nuovo). Si tratta di un comportamento previsto in iOS 6? C'è un modo per far sì che la webview scorra quando un input prende fuoco (come funziona iOS 5)?UIWebView che scorre verso il basso sul focus di input solo per iOS 6
risposta
Senza conoscere il funzionamento interno del codice, cercherò di aiutare il più possibile. Se non altro, spero di fornire qualche spunto di riflessione. Hai posto due domande:
È previsto un comportamento in iOS6?
Quello che stai vedendo è abbastanza strano di sicuro. È strano che la webView stia centrando il modulo piuttosto che centrare il campo di input. E sicuramente non dovrebbe far sì che il campo di input attivo scorra fuori dalla vista. Inoltre, la tastiera sembra smettere di funzionare, il che è piuttosto strano. Tuttavia, si prevede un comportamento diverso in iOS 5 e 6 per quanto riguarda lo scorrimento webView. Come hai detto, iOS 5 scorre il campo di input in vista mentre iOS6 lo colloca al centro.
C'è un modo per evitare che la visualizzazione del Web scorra quando un input diventa attivo (come funziona iOS 5)?
Sì. Fornisco il codice per fare solo questo qui sotto - vale a dire per fermare la visualizzazione Web dallo scorrimento. Se è esattamente ciò che vuoi fare, allora è grandioso. Tuttavia, l'interruzione della visualizzazione Web dallo scorrimento non equivale a ottenere lo stesso comportamento di iOS5. Tuttavia, volevo darti questa opzione come richiesto.
#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
Se si desidera un comportamento coerente di scorrimento ...
ho preso un po 'di tempo per codificare fino questa modifica di scorrimento. Puoi utilizzarlo come riferimento per rendere il tuo comportamento di scorrimento coerente con iOS 5 & 6. In questo codice: quando l'utente fa clic su una casella di testo in una pagina Web, il codice interromperà il comportamento di scorrimento predefinito mantenendo pagina scorsa alla sua posizione corrente. Sfortunatamente, non c'è modo di cancellare tutto lo scrolling, ma piuttosto è necessario sovrascrivere le scroll.Una volta che lo scorrimento predefinito è stato "soppresso", ottiene la posizione della casella di input attiva e scorre in quella posizione. Questo metterà la casella di input attiva nella parte superiore dello schermo. Puoi modificarlo in base alle tue preferenze. Ad esempio, puoi usare [UIScrollView scrollRectToVisible] per renderlo più simile a 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
Se questo codice ti ha aiutato, sarebbe molto carino da parte tua premiare la generosità con me. Sarei umilmente riconoscente.
Una soluzione potrebbe essere invalidante il rotolo in questa UIWebView:
UIScrollView *scrollView = webView.scrollView;
[scrollview setScrollEnabled:NO];
[scrollView bounces:NO];
Un altro potrebbe essere l'impostazione del UIEdgeInsets di questo ScrollView ma non so molto su questo.
Penso che questo sia un comportamento standard in iOS 5 e 6 per scorrere per rendere il campo di input solo sulla parte superiore della tastiera (proprio come fa Safari).
l'impostazione dello scrollEnabled impedisce solo lo scrolling dell'utente, non lo scorrimento del sistema da tastiera –
Ok, buono a sapersi grazie per il tuo feedback – dulgan
La risposta controllato su questo post non ha la risposta: How to make a UITextField move up when keyboard is present?
In breve, è necessario spostare la vista contenente gli ingressi che sono spinti fuori dal campo visivo. Il post contiene anche un codice di esempio su come farlo.
Spero che questo aiuti.
la domanda riguarda specificamente una webView. C'è una grande differenza tra un UITextField e un campo di input del form all'interno di una pagina web. il post di riferimento non funzionerà su WebView. –
Qual è il frame di UIWebView? – Jessedc
Puoi darmi il link/url che cosa stai aprendo in web view. In modo che io possa capire meglio il tuo problema. – Swati