2011-08-25 12 views
7

Ho un'applicazione con una vista che ha campi di testo dalla parte superiore della vista alla parte inferiore della vista. Ne avevo bisogno per scorrere quando si modificano i campi inferiori in modo che i campi siano visibili, ma sembra che non funzioni correttamente.Tastiera Scorri sul campo di testo attivo - Scorrendo fino a non visualizzare?

Dopo la Apple docs, ho messo tutto questo codice nel mio programma (Liste 4-1, 4-2), e ha aggiunto le prese scrollView e activeField al mio file di intestazione e li collegato a IB.

Il problema è che non faccio clic su un campo di testo, TUTTI i campi di testo non vengono visualizzati finché non ignoro la tastiera. Scorrono molto lontano (di nuovo, abbastanza lontano da dove nessuno dei campi è visibile).

Qualcuno sa da cosa potrebbe essere causato questo problema?

Sto inserendo il codice qui da Apple Docs in modo da poter vedere esattamente quale codice sto usando senza dover fare clic di distanza.

//my .h 
    IBOutlet UIScrollView *scrollView; 
    IBOutlet UITextField *activeField; 

//.m 
    // Call this method somewhere in your view controller setup code. 
    - (void)registerForKeyboardNotifications 
    { 
     [[NSNotificationCenter defaultCenter] addObserver:self 
       selector:@selector(keyboardWasShown:) 
       name:UIKeyboardDidShowNotification object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(keyboardWillBeHidden:) 
      name:UIKeyboardWillHideNotification object:nil]; 

} 

// Called when the UIKeyboardDidShowNotification is sent. 
- (void)keyboardWasShown:(NSNotification*)aNotification 
{ 
    NSDictionary* info = [aNotification userInfo]; 
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0); 
    scrollView.contentInset = contentInsets; 
    scrollView.scrollIndicatorInsets = contentInsets; 

    // If active text field is hidden by keyboard, scroll it so it's visible 
    // Your application might not need or want this behavior. 
    CGRect aRect = self.view.frame; 
    aRect.size.height -= kbSize.height; 
    if (!CGRectContainsPoint(aRect, activeField.frame.origin)) { 
     CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbSize.height); 
     [scrollView setContentOffset:scrollPoint animated:YES]; 
    } 
} 

// Called when the UIKeyboardWillHideNotification is sent 
- (void)keyboardWillBeHidden:(NSNotification*)aNotification 
{ 
    UIEdgeInsets contentInsets = UIEdgeInsetsZero; 
    scrollView.contentInset = contentInsets; 
    scrollView.scrollIndicatorInsets = contentInsets; 
} 
- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    activeField = textField; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    activeField = nil; 
} 
+0

ho modificato il copia-incolla del codice di Apple dal tuo post, perché è dubbio che ha così permesso da Apple per riprodurlo. Ho anche segnalato un moderatore per dare un'occhiata - non sono sicuro di quale sia o dovrebbe essere la politica ufficiale. –

+0

@Josh: Questa piccola quantità di codice è probabilmente OK, per ["Fair Use,"] (http://en.wikipedia.org/wiki/Fair_use). –

+0

@Robert: Ok, grazie. James, immagino che questo significhi che dovresti rimetterlo in posto se lo scegli tu. Scusa per il disturbo. –

risposta

33

UPDATE: Sotto risposta è obsoleto. Per ora è possibile utilizzare la libreria "TPkeyboardavoiding" per gestire tutti i tipi di operazioni sul campo di testo in UIScrollView, UITableView & molti altri. Provalo e fammi sapere se qualcuno ha un problema di integrazione.

Vecchio risposta

Non c'è bisogno di registrarsi per le notifiche da tastiera per questa funzionalità. Al fine di centrare la textField attiva lo schermo sopra la tastiera, è sufficiente impostare la contentOffset dei UIScrollView due metodi, come mostrato qui:

// called when textField start editting. 
- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    activeField = textField; 
    [scrollView setContentOffset:CGPointMake(0,textField.center.y-60) animated:YES]; 
} 



// called when click on the retun button. 
- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 


    NSInteger nextTag = textField.tag + 1; 
    // Try to find next responder 
    UIResponder *nextResponder = [textField.superview viewWithTag:nextTag]; 

    if (nextResponder) { 
     [scrollview setContentOffset:CGPointMake(0,textField.center.y-60) animated:YES]; 
     // Found next responder, so set it. 
     [nextResponder becomeFirstResponder]; 
    } else { 
     [scrollview setContentOffset:CGPointMake(0,0) animated:YES]; 
     [textField resignFirstResponder]; 
     return YES; 
    } 

    return NO; 
} 

Nota: Tutti i TextField dovrebbe avere tag incrementali come 1,2, 3 e quindi no. E imposta i delegati a se stessi.

Grazie,

+5

Se il campo di testo non è contenuta direttamente in la vista di scorrimento, 'center.y' sarà nella posizione sbagliata. Pertanto, si dovrebbe usare qualcosa come questo che calcola la posizione corretta: '_scrollView.contentOffset = CGPointMake (0, [_scrollView convertPoint: CGPointZero fromView: textField] .y - 60);' – AndiDog

+0

qual è il valore -60? –

+0

-60 era l'offset che sarà variabile in base alla visualizzazione e alle dimensioni della tastiera. Nel mio caso quel valore era più adatto per me. – MinuMaster

0

Dopo essersi assicurati che il delegato è stato impostato, sono andato attraverso il codice e ha richiamato tutte le coordinate di ogni cosa e ha fatto tutto la matematica e ha dovuto impostare manualmente alcune variabili, ma ora è funziona come previsto.

Se qualcuno ha bisogno di aiuto con esso in futuro sarò lieto di aiutare. Il mio Twitter è nel mio profilo.

+0

Ciao James, ho incontrato anche un problema seguendo il documento della Apple. Il mio problema è quando tocco il campo di testo, non succede nulla. La barra di scorrimento non verrà visualizzata e non è in grado di scorrere. Potresti darmi una mano su questo? Grazie in anticipo. – dumbfingers

+0

Ci scusiamo per la risposta lenta. Sono stato impegnato al lavoro. Hai un codice che posso guardare? Se stai usando IB, assicurati che tutti i tuoi punti vendita siano collegati. – Baub

+0

Hey James, grazie per la tua risposta, ho risolto questo problema da solo poche ore dopo averti chiesto. grazie comunque!!! – dumbfingers

6

Dal momento che ho trovato, io uso TPKeyboardAvoiding

Si sta lavorando molto, ed è molto facile da installare:

  1. Aggiungi un UIScrollView nella XI ter del controller della vista
  2. Impostare classe della vista di scorrimento a TPKeyboardAvoidingScrollView (sempre nello xib, tramite l'ispettore identità)
  3. Inserisci tutti i tuoi controlli all'interno di tale scrollview

Inoltre, collega automaticamente i pulsanti "Avanti" sulla tastiera per passare attraverso i campi di testo.

Buona fortuna!

1

@ L'approccio di Minumaster funziona bene ma vorrei suggerire un modo molto più semplice ma generalizzato come fa Apple prendendo in considerazione l'altezza delle tastiere che è molto utile quando usiamo la barra degli strumenti personalizzata sulla parte superiore della tastiera. sebbene l'approccio di Apple here abbia pochi problemi.

Ecco il mio approccio (leggermente modificato il modo di apple) -

// Called when the UIKeyboardDidShowNotification is sent. 
- (void)keyboardWasShown:(NSNotification*)aNotification 
{ 
    NSDictionary* info = [aNotification userInfo]; 
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0); 
    self.scrollView.contentInset = contentInsets; 
    self.scrollView.scrollIndicatorInsets = contentInsets; 
} 

// Called when the UIKeyboardWillHideNotification is sent 
- (void)keyboardWillBeHidden:(NSNotification*)aNotification 
{ 
    UIEdgeInsets contentInsets = UIEdgeInsetsZero; 
    self.scrollView.contentInset = contentInsets; 
    self.scrollView.scrollIndicatorInsets = contentInsets; 
} 
Problemi correlati