2009-12-14 14 views
5

Mögliche Duplizieren:
Can you animate a height change on a UITableViewCell when selected?Animate UITableViewCell Höhe auf Auswahl

Ich habe viel Googeln tun, um zu versuchen, den richtigen Weg, dies zu tun, um herauszufinden, und so weit Ich bin ratlos.

Ich habe UITableViewCell mit meiner eigenen Sicht subclassiert und ich versuche, die Höhe einer UITableViewCell zu animieren, um zu erweitern, wenn es ausgewählt ist, und zu kontrahieren, wenn es erneut ausgewählt wird. Diese Tabelle kann Tausende von Zeilen enthalten. Daher möchte ich die heightForRowAtIndexPath-Eigenschaft der Tabelle nicht überschreiben. Idealerweise möchte ich in der Lage sein, mehr als eine Zelle gleichzeitig zu erweitern, aber das ist nicht so kritisch. Was ist der beste Weg, dies zu tun?

Danke, Justin

Antwort

6

Es gibt keinen anderen Mechanismus für die als heightForRowAtIndexPath Zellenhöhe angeben. Wenn Sie die erweiterte Zelle in dieser Methode nicht richtig berücksichtigen, werden Sie feststellen, dass Ihre anderen Zellen entweder darüber laufen oder darunter verborgen sind. Von boneheaded Code, wo ich vergessen habe, heightForRowAtIndexPath einzurichten, bin ich ziemlich sicher, dass Ihre anderen Zellen darüber angezeigt werden.

Da Sie Tausende von Zeilen sprechen, nehmen wir an, dass der Benutzer die Zellen nicht neu anordnen kann.

Sie können den Indexpfad der erweiterten Zelle speichern, wenn der Benutzer auf eine bestimmte Zelle tippt. Dann heightForRowAtIndexPath könnte wie folgt aussehen:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 

if ([indexPath isEqual:lastSelectedIndexPath]) 
{ 
    return 80; 
} 

else { 
    return 44; 
} 

} 

Wenn Sie wirklich mehrere Auswahlen möchten, können Sie die entsprechenden Indexpfade speichern, um ein Array und prüfen, ob sie wie folgt aus:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 

CGFloat cellHeight = 44; 

for (NSIndexPath *expandedIndexPath in expandedIndexPathsArray) 
{ 
    if ([indexPath compare:expandedIndexPath] == NSOrderedSame) 
    { 
     cellHeight = 80; 
     break; 
    } 
} 

return cellHeight; 

} 

Erste der Animation nach rechts schauen wird etwas Arbeit brauchen. Ich habe schon eine Weile mit dieser speziellen UI-Idee gespielt und konnte mich nie dazu durchringen, mich hinzusetzen und es wirklich umzusetzen. Eine Sache, die Sie tun können, ist eine Dummy-Ansicht anzuzeigen, die animiert, während Sie die Tabellenansicht dahinter aktualisieren.

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPathswithRowAnimation:(UITableViewRowAnimation)animation 

könnte dies von Interesse sein, wie Sie die Zelle Animationen zu verwenden, könnte der Lage sein, die Bewegung der Zellen zu simulieren, unter Ihrer Expansion gerecht zu werden.

Wenn Sie darauf verzichten können, den Rahmen der Zelle vollständig zu animieren, können Sie eine Opazitätsanimation der expandierten Daten durchführen, sobald die neue Höhe festgelegt wurde.

Es ist ein Toughie, aber wenn du es schaffst, wette ich, es wird ziemlich cool. Viel Glück.

+1

Danke Danilo, du hast mich auf den richtigen Weg gebracht. Am Ende funktionierte es mit reloadRowsAtIndexPaths in didSelectRowAtIndexPath. Ich überprüfe, ob die Zelle erweitert ist und setze die entsprechende Höhe in heightForRowAtIndexPath, genau wie du erwähnt hast. Danke noch einmal! – Justin

+1

Zu cool! Freut mich, Ihnen einen hilfreichen Anstoß zu geben. Hoffe es klappt. Vielleicht werde ich es irgendwann selbst ausprobieren. –

+1

'[indexPath compare: expandedIndexPath] == NSOrderedSame' sollte als' [indexPath isEqual: expandedIndexPath] 'geschrieben werden – user102008

Verwandte Themen