2009-08-23 13 views
17

Wenn ich versuche, die Rahmenhöhe eines tableView (ex: height -= 200) zu animieren, verschwinden die Zellen, die in den letzten 200px erscheinen plötzlich, bevor die glatte Animation des Frames abgeschlossen ist.UITableView Rahmenhöhe Animation Glitch

Um sicherzustellen, dass es nichts anderes ist, das ich mache, habe ich eine neue Ansicht-basierte Anwendung erstellt. In der Hauptsache viewController erstelle ich meine eigene tableview mit genug pseudo rows, um den gesamten Bildschirm zu füllen. Und bei der Auswahl einer Reihe mache ich eine einfache Höhenanimation.

relevanteste Code:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.myTable = [[[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)] autorelease]; 
    myTable.delegate = self; 
    myTable.dataSource = self; 
    [self.view addSubview:myTable]; 
} 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    CGRect frame = self.myTable.frame; 
    frame.size.height = 200; 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationDelay:.5f]; 
    [UIView setAnimationDuration:0.5f]; 
    self.myTable.frame = frame; 
    [UIView commitAnimations]; 
} 

Weiß jemand, warum dies geschieht, oder was für eine fix/Abhilfe sein kann?

Alle Vorschläge sind sehr geschätzt. TIA!

Antwort

0

Ich habe Ihre Frage bei der Suche nach der richtigen Methode zur Größenänderung eines TableView gefunden. Ich denke, Ihr Problem ist in Ihrer Animation, die Sie UIView statt UITableView angegeben haben. Ich konnte Ihr Problem nicht mit UIView oder UITableView duplizieren, aber ich verwende SDK 3.1 und es könnte ein Fehler sein, der seit Ihrem Post behoben wurde. Ich bin mir nicht sicher, aber ich hoffe, das hilft!

+0

Nein, es ist richtig, "UIView" -Methoden für die Animationsaufrufe zu verwenden. – rluba

+0

Ich habe den gleichen Code mit 3.1 auch versucht, und immer noch ein Problem für mich;/Meine aktuelle Problemumgehung ist es zu warten, bis die Animation abgeschlossen ist, bevor die Größe der Tabelle ändern – dizy

0

Ich habe genau das gleiche Problem. Ich stelle mir vor, dass Tabellenansichten ein spezielles Verhalten auf "setFrame:" haben, es scheint, dass die Tabellenansicht die Zellen entfernt, die mit dem neuen Frame nicht sichtbar sind.

Im Falle einer Animation sind die Zellen nicht nur am Ende der Animation sichtbar, aber es scheint, dass Tabellenansichten nicht wichtig sind.

Wenn jemand eine bessere Theorie hat, würde ich mich freuen, es zu hören!

8

Das gleiche Problem auch hier. Das ist was ich mache und die Herkunft animiert reibungslos, aber die Größe ändert sich sofort ... nervig.

[UIView beginAnimations:@"HideTabbar" context:nil]; 
    [UIView setAnimationDuration:.3]; 
     self.tableView.frame = CGRectMake(0.0, 44.0, 320, 366); 
    [UIView commitAnimations]; 

UPDATE: Versuchen Sie, diese vor der Animation hinzufügen:

self.tableView.autoresizingMask = UIViewAutoresizingNone; 
+1

Ändern der Autoresizingmask auf "keine" in meiner Situation definitiv funktioniert. Vielen Dank. – macandyp

15

Ich bin nicht sicher, ich genau hatte das gleiche Problem, aber [UIView setAnimationBeginsFromCurrentState:YES]; gelöst (oder Teile davon), die Störungen mit (meinem Tisch rutschte bei der Animation einer Rahmenhöhenänderung verrückt herum).

+1

danke. löste es für mich. Problem: Animieren der äußeren Ansicht (Rahmen) - und Ändern der Größe einer inneren Textansicht (nur neue Höhe - Pos soll gleich bleiben) –

3

Dies ist eine alte Frage und es gibt bereits ein paar Vorschläge für eine Workaround, aber ich dachte, ich würde meins hinzufügen.

Ich endete mit der Animation der contentInset und scrollIndicatorInsets Eigenschaften, die die Illusion bietet, dass die Tabelle selbst in der Größe geändert wird.

4

Für jeden, der diese Frage beantwortet & Antwort in der Zukunft, hier ist, wie @Ryysts Antwort in UIViews blockbasierten Animationen in iOS 4 eingeführt.

[UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
      // change frame etc here 
    } completion:^(BOOL finished) { 
      // any clean up here 
    }]; 
0

Es ist eine alte Frage, aber das könnte jemandem in der Zukunft helfen;

Ich löste ein ähnliches Problem durch die tableview in einem UIView, Einbettung und die UIView statt tableview Ändern der Größe. Ich setzte die Höhe tableview's auf einen großen Wert und auch "Clip Subviews" -Eigenschaft auf der UIView. Ich skaliere die UIView proportional zu contentSize Tableview. Es ist keine gute Lösung, aber es hat für meine Zwecke funktioniert.

+0

Dies wird ein anderes Problem verursachen, Sie werden die letzten Zellen von tableView nicht sehen können, da sie sich innerhalb des Rahmens von tableView befinden Unterhalb des sichtbaren Rahmens des ContainersUIView wird also tableView abprallen, wenn Sie versuchen, einen Bildlauf durchzuführen, da es das Ende der Zellen erreicht hat und Sie es dennoch nicht sehen können – Mehdi

0

Endlich die Lösung gefunden! Es gibt tatsächlich einen Fehler !! Verwenden Sie nicht variables, wenn animieren die Höhe verwenden [[UIScreen mainScreen] bounds]. Wie folgt aus:

[UIView animateWithDuration:0.5 animations:^{ 
      tableView.frame=CGRectMake(0, 38, fullScreenRect.size.width, [[UIScreen mainScreen] bounds].size.height-38); 
}]; 

nicht:

[UIView animateWithDuration:0.5 animations:^{ 
      tableView.frame=CGRectMake(0, 38, fullScreenRect.size.width, fullScreenRect.size.width-38); 
}]; 

und es wird wie Magie arbeiten!

Verwandte Themen