2016-04-03 8 views
3

Manchmal, wenn Tabellenansicht Zellen in Animationen, e, g, -[UIView viewWillAppear:animated] mit -[UITableView reloadData] erscheinen, die Inhalte in ihnen pop von oben links Ecke (0, 0) zu den letzten Frames . Dieses Problem tritt auch in anderen Ansichtsanimationen auf. Damals gab es dieses Problem nicht. In einem iOS-Update tauchte das Problem auf, aber die Anfangspositionen waren zufällig, normalerweise außerhalb des Bildschirms. In einem anderen iOS-Update wurde das Problem deterministisch, wobei die Anfangsposition (0,0) war.Verhindern von Ansichten von oben links während Animationen unter iOS

Ich habe versucht [tableView layoutIfNeeded], [tableView.layer displayIfNeeded] nach [tableView reloadData] und diejenigen auf Zellen in cellForRowAtIndexPath. Was habe ich vermisst?

Ich habe ein Beispielprojekt https://github.com/keithyipkw/ios-animation-bug hochgeladen. Um das Problem zuverlässig zu reproduzieren, setzen Sie einen Haltepunkt bei viewWillAppear, vor reloadData. Ziehen Sie den Bildschirm nach unten, um das heutige Zentrum anzuzeigen. Laufen Sie nach dem heutigen Zentrum voll sichtbar. Auch

screenshots

Antwort

0

Die Fehlerbehebung besteht darin, die Warteschlangen- und Initialisierungszellen mit Wiederverwendungskennungen zu verwenden. Es funktioniert immer noch, wenn eine Zelle das erste Mal erscheint. Die Magie besteht darin, mit demselben Nicht-Null-Identifikator aus der Warteschlange zu entfernen.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 
if (!cell) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 
} 
0

Ich habe das gleiche Problem, das passiert, wenn die TV-Zellen zum ersten Mal angezeigt wird.
Dies ist aufgrund der Tatsache, dass Zellen mit der ursprünglichen Größe des Prototyps im Storyboard erstellt und später auf der TV-Breite Größe angepasst. Um das in cellForRowAtIndexPath zu vermeiden, stelle ich die Breite auf der Zelle auf die Größe des Fernsehers ein und erzwinge ein automatisches Layout-Update für die Zelle, damit alle Elemente bereits auf diese Größe passen.
Ich habe immer noch keine echte Lösung gefunden, das ist mehr ein Trick, ich hoffe, jemand anderes gibt ein Feedback zu Ihrer Frage.