2013-10-04 12 views
10

Ho una vista tabella con celle statiche. Una cella contiene uno UITextView e lo heightForRowAtIndexPath: viene calcolato dinamicamente in modo che la cella sia sempre abbastanza alta da contenere il testo (quella parte ha funzionato in iOS 7, in realtà, poiché non è più possibile chiedere semplicemente textView per il suo contentSize).UITableView in iOS 7 non scorre nella posizione corretta durante la modifica di UITextView nella cella

Quando tocco all'interno della visualizzazione del testo per iniziare a modificare, la tastiera si anima, i contentInsets sul tavoloView vengono regolati automaticamente per tener conto di ciò (ovvero, il margine inferiore di 216 px per l'orientamento verticale di iPhone), il cursore/cursore diventa visibile, quindi la vista tabella scorre in un'altra posizione. Finisce per sembrare un rimbalzo.

Ecco un video di questo nel simulatore: https://www.dropbox.com/s/htdbb0t7985u6n4/textview-bounce.mov

Si noti che per un secondo il punto di inserimento è appena sopra la tastiera. Ho registrato la vista tabella contentOffset e posso vederla scorrere fino a un valore piacevole e poi improvvisamente "girarci" e scorrere indietro.

Stranamente, se accendo animazioni lente nel simulatore il problema scompare; l'inversione contentOffset non si verifica e le cose funzionano come previsto (ovvero, il comportamento di iOS 6).

Ecco il video con animazioni lente: https://www.dropbox.com/s/nhn7vspx86t4exb/textview-nobounce.mov

Note applicative:

  • La vista del testo è rosa e ha vincoli di layout automatico che lo tengono inchiodato al cellulare a distanza 0 (eccetto lato sinistro, che è 10pts)
  • Sto utilizzando boundingRectWithSize: per calcolare l'altezza di visualizzazione tabella, regolando per lineFragmentPadding e qualsiasi insetto superiore/inferiore. Sembra funzionare.
  • Ho impostato il textView di non essere scorrevole, ma non ha notato nulla di diverso quando scrollEnabled == SI
  • Si tratta di un controller di vista tavolo e automaticallyAdjustsScrollViewInsets == SI
+1

Ho esattamente lo stesso problema, ho rintracciato al contentSize del corso il ripristino UITableView dopo faccio un beginupdates UITableView e endupdates – perrohunter

risposta

3

tenta di regolare UITableView telaio quando appare la tastiera. Chiama [self attachKeyboardHelper] in viewWillAppear e [self detachKeyboardHelper] in viewWillDisappear.

- (void)attachKeyboardHelper{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillAppear:) 
               name:UIKeyboardWillShowNotification 
               object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillHide:) 
               name:UIKeyboardWillHideNotification 
               object:nil]; 
} 

- (void)detachKeyboardHelper{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

- (void)keyboardWillAppear:(NSNotification *)notification{ 
    NSDictionary* userInfo = [notification userInfo]; 

    NSTimeInterval animationDuration; 
    UIViewAnimationCurve animationCurve; 
    CGRect keyboardEndFrame; 

    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve]; 
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration]; 
    [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame]; 

    // Animate up or down 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:animationDuration]; 

    CGRect keyboardFrame = [self.view convertRect:keyboardEndFrame toView:nil]; 
    if(self.view==self.tableView){ 
     CGRect newTableFrame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y, self.tableView.frame.size.width, self.view.bounds.size.height-keyboardFrame.size.height); 
     self.tableView.frame = newTableFrame; 
    }else{ 
     CGRect newTableFrame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y, self.tableView.frame.size.width, self.view.bounds.size.height-self.tableView.frame.origin.y-keyboardFrame.size.height); 
     self.tableView.frame = newTableFrame; 
    } 

    [UIView commitAnimations]; 
} 

- (void)keyboardWillHide:(NSNotification *)notification{ 
    NSDictionary* userInfo = [notification userInfo]; 

    NSTimeInterval animationDuration; 
    UIViewAnimationCurve animationCurve; 
    CGRect keyboardEndFrame; 

    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve]; 
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration]; 
    [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame]; 


    CGRect newTableFrame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y, self.tableView.frame.size.width, self.view.superview.bounds.size.height-self.tableView.frame.origin.y); 
    self.tableView.frame = newTableFrame; 
    if(newTableFrame.size.height>self.tableView.contentSize.height-self.tableView.contentOffset.y){ 
     float newOffset=MAX(self.tableView.contentSize.height-newTableFrame.size.height, 0); 
     [self.tableView setContentOffset:CGPointMake(0, newOffset) animated:YES]; 
    } 

} 
+0

hai qualche codice sorgente? –

+1

Ho aggiunto il codice sorgente – VChemezov

+0

La risposta è migliorata molto con alcuni esempi. Buono per i neofiti che stanno cercando di trovare risposte qui ;-) –

Problemi correlati