Ich habe example for Multi-row selection Cocoa mit der Liebe implementiert, die eine benutzerdefinierte UITableViewCell umfasst das Erstellen, die eine Animation in layoutSubviews initiiert Kontrollkästchen links von jeder Zeile angezeigt werden, etwa so:UITableViewCell Animation, wenn
- (void)layoutSubviews
{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
[super layoutSubviews];
if (((UITableView *)self.superview).isEditing)
{
CGRect contentFrame = self.contentView.frame;
contentFrame.origin.x = EDITING_HORIZONTAL_OFFSET;
self.contentView.frame = contentFrame;
}
else
{
CGRect contentFrame = self.contentView.frame;
contentFrame.origin.x = 0;
self.contentView.frame = contentFrame;
}
[UIView commitAnimations];
}
Dies funktioniert gut und in jeder Hinsicht funktioniert mein UITableView so, wie es sollte. Ich stoße jedoch auf ein kleines ästhetisches Problem: Beim Scrollen meiner UITableView-Zeilen, die vorher nicht angezeigt wurden, wird ihre Gleitanimation ausgelöst, was bedeutet, dass die Animation für bestimmte Zeilen gestaffelt ist, wenn sie in Sicht kommen.
Dies ist verständlich, da setAnimationBeginsFromCurrentState auf YES gesetzt wurde und Zeilen weiter unten in UITableView ihre Frame-Position noch nicht aktualisiert haben. Um das Problem zu lösen, habe ich versucht, mithilfe von willDisplayCell die Animation für Zellen zu überschreiben, die sichtbar werden, während sich das UITableView im Bearbeitungsmodus befindet. Im Wesentlichen um die Animation zu umgehen und die Zeilen Frame unmittelbar zu aktualisieren, um sie als erscheinen, wenn die Zelle bereits an Ort und Stelle animiert hat, etwa so:
/*
Since we animate the editing transitions, we need to ensure that all animations are cancelled
when a cell is scheduled to appear, so that things happen instantly.
*/
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
[cell.contentView.layer removeAllAnimations];
if(tableView.isEditing) {
CGRect contentFrame = cell.contentView.frame;
contentFrame.origin.x = EDITING_HORIZONTAL_OFFSET;
cell.contentView.frame = contentFrame;
} else {
CGRect contentFrame = cell.contentView.frame;
contentFrame.origin.x = 0;
cell.contentView.frame = contentFrame;
}
}
Leider hat dies keine Auswirkungen zu haben scheint. Hat jemand eine Idee, wie ich dieses Problem lösen kann?