2013-10-04 20 views
10

Ich habe eine Tabellenansicht mit statischen Zellen. Eine Zelle enthält eine UITextView und die heightForRowAtIndexPath: wird dynamisch berechnet, so dass die Zelle immer groß genug ist, um den Text aufzunehmen (dieser Teil hat unter iOS 7 tatsächlich etwas Arbeit gemacht, da es nicht länger möglich ist, einfach die textView nach seiner contentSize zu fragen).UITableView in iOS 7 Scrollen nicht zum richtigen Speicherort beim Bearbeiten von UITextView in Zelle

Wenn ich in der Textansicht tippe, um mit der Bearbeitung zu beginnen, animiert die Tastatur an Ort und Stelle, die contentInets auf der tableView werden automatisch angepasst, um dem Rechnung zu tragen (dh untere Einfügung von 216px für iPhone Hochformat), der Cursor/Caret wird sichtbar, und dann scrollt die Tabellenansicht zu einem anderen Speicherort. Es sieht aus wie ein Sprung.

Hier ist ein Video von diesem im Simulator: https://www.dropbox.com/s/htdbb0t7985u6n4/textview-bounce.mov

Beachten Sie, dass für eine Sekunde der Einfügemarke gerade oberhalb der Tastatur sind. Ich habe die Tabellenansicht contentOffset protokolliert und ich kann sehen, wie es sich auf einen netten Wert scrollt und dann plötzlich "umdreht" und zurück scrollt.

Seltsamerweise, wenn ich langsame Animationen im Simulator einschalte, verschwindet das Problem; Die contentOffset Umkehrung passiert nicht und die Dinge funktionieren so, wie ich es erwarte (zB iOS 6 Verhalten).

Hier ist das Video mit langsamen Animationen: https://www.dropbox.com/s/nhn7vspx86t4exb/textview-nobounce.mov

Hinweise zur Implementierung:

  • Die Textansicht ist rosa und hat Automatisches Layout Einschränkungen, die es in der Zelle im Abstand 0 (mit Ausnahme der linken Seite festgesteckt halten, was ist 10pts)
  • Ich benutze boundingRectWithSize:, um die Höhe der Tabellenansicht zu berechnen, Anpassung für lineFragmentPadding und alle oberen/unteren Einfügungen. Scheint zu arbeiten.
  • Ich habe die Textview gesetzt nicht scrollbaren sein, aber gar nicht bemerkt etwas anderes, wenn scrollEnabled == JA
  • Dies ist eine Tabelle View-Controller und automaticallyAdjustsScrollViewInsets == JA
+1

Ich habe genau das gleiche Problem, ich habe es mit dem Content des UITableView zurückgesetzt wird verfolgt, nachdem ich ein UITableView beginupdates und EndUpdates tun – perrohunter

Antwort

3

Try UITableView Rahmen anpassen wenn die Tastatur erscheint. Rufen Sie [self attachKeyboardHelper] in ViewWillAppear und [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

Haben Sie eine Quellcode? –

+1

Ich habe den Quellcode hinzugefügt – VChemezov

+0

Die Antwort wurde mit ein paar Beispielen viel besser. Gut für Neulinge, die hier Antworten suchen ;-) –