2010-11-25 8 views
4
Scrollen

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?

Antwort

1

Nicht sicher, ob Sie noch eine Antwort auf diese Frage benötigen, aber ich lief gerade in genau das gleiche Problem, so dass ich dachte, dass ich meine Lösung teilen würde. Ich habe Multi-Selection auf die gleiche Weise implementiert, wie es im Cocoa with Love Blogpost beschrieben wurde.

In der CellAtIndexPath DataSource-Methode, wenn ich eine neue Zelle erstellen (nicht wenn die Zelle bereits in der Warteschlange von wiederverwendbaren Zellen ist), überprüfe ich, ob die TableView im Bearbeitungsmodus ist und wenn ich eine Eigenschaft für die Zelle (Ich habe meine eigene benutzerdefinierte Zelle mit einer EnableAnimation-Eigenschaft erstellt, die auf false gesetzt ist. Wenn sie den SetEditing-Callback erhält, animiert sie die Zelle nicht, stattdessen wird nur der Frame gesetzt. Im Konstruktor der Cell-Klasse setze ich EnableAnimation auf true. Wenn der Callback von SetEditing aufgerufen wird, setze ich EnableAnimation auf das animierte Argument, das übergeben wird. Ich hoffe, das hilft.