2012-04-17 6 views
7

Mam zwykły UITableView z 4 rzędami, każdy o wysokości 50. Kiedy naciskam czwarty wiersz, wstawiam piąty rząd o wysokości 80 przy użyciu UITableViewRowAnimationTop. Jak na razie dobrze.Animacja wygląda niezręcznie podczas usuwania komórki, której wysokość jest większa niż inne komórki.

Chcę usunąć piąty rząd, gdy czwarty wiersz zostanie ponownie naciśnięty. Ale kiedy usuwam wiersz za pomocą UITableViewRowAnimationTop (lub innego stylu animacji), animacja wygląda bardzo niezręcznie - animacja zaczyna się, ale komórka znika nagle, zanim animacja zostanie ukończona. (Jest to widoczne tylko wtedy, gdy używasz komórek, które mają kolor tła.) Dolna część komórki nagle znika, zamiast znikać pod komórką powyżej.)

Kod jest podobny do poniższego:

[self.tableview beginupdates]; 
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop]; 
[self.tableview endupdates]; 

Wysokości rzędów podano w metodzie tableView:heightForRowAtIndexPath:.

Ten problem nie występuje, gdy wszystkie wiersze mają taką samą wysokość lub gdy usuwany wiersz jest krótszy niż pozostałe wiersze.

myślę jeden obejście jest zmiana wysokości piątego komórki do 50 przed usunięciem go, ale wolałbym nie robić that.Please pomóc

Odpowiedz

0

Czy próbowano to robić bez rozpocząć/endUpdates? Przypominam sobie niewyraźnie, że używam tych, którzy robią dziwne rzeczy.

Czy próbowałeś reloadRowsAtIndexPaths: dla rzędu następny? Przypuszczam, że jest jeden.

Czy na pewno źródło danych zachowuje się poprawnie pod względem odpowiedzi heightForRow w miejscu, w którym wykonywane jest wywołanie deleteRowsAt? (np. możesz ustawić flagę, aby wskazać, że rzecz nie jest już widoczna po wywołaniu usunięcia, co może spowodować, że nowy wiersz będzie miał złą wysokość)

1

Właśnie wpadłem na ten problem dziś rano. Zasadniczo sam wykonałem animację, a następnie usunąłem komórkę po ukończeniu animacji. Oto kod, który pokazuje, jak to zrobiłem:

@property (nonatomic, strong) NSArray *tableData; 
@property (nonatomic, strong) NSMutableDictionary *deletedItems; 
... 

- (void)deleteItemForCell:(UITableViewCell *)cell 
{ 
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
    NSObject *item = self.tableData[indexPath.row]; 

    NSNumber *rowKey = @(indexPath.row); 

    __weak id weakSelf = self; 
    [CATransaction setCompletionBlock:^{ 
     @synchronized(weakSelf) { 
      [self.deletedItems removeObjectForKey:rowKey]; 
      [self.tableData removeObject:item]; 
      [self.tableView deleteRowsAtIndexPaths:@[indexPath] 
            withRowAnimation:UITableViewRowAnimationNone]; 
     } 
    }]; 
    self.deletedItems[rowKey] = item; 

    [self.tableView beginUpdates]; 
    [self.tableView endUpdates]; 

    [CATransaction commit]; 
} 

- (CGFloat)tableView:(UITableView *)tableView 
    heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (self.deletedItem[@(indexPath.row)]) { 
     return 0; 
    } 
    return CELL_HEIGHT; 
} 

Kod śledzi usunięte elementy w strukturze danych i informuje tabelę o aktualizacji. Wszystkie elementy w usuniętej strukturze danych uzyskają wartość 0, co spowoduje powstanie animacji "zwinięcia".

Kod wykorzystuje usługę CATransaction do sprawdzania, kiedy animacja została zakończona. Po zakończeniu element jest usuwany ze struktury danych tableData i usuwany z tabeli bez animacji.

UWAGA:

  • Nie jestem pewien, czy synchronizacja jest wymagane, ale wydawało się mieć inteligentny, ponieważ mamy do czynienia z asynchronicznie usuwanie elementów.
  • Próbowałem użyć obiektu indexPath jako klucza do słownika, ale nie działało. Zamiast tego użyłem wiersza.

Mam nadzieję, że to pomoże.

1

Użycie UITableViewRowAnimationMiddle sprawiło, że stało się dla mnie trochę mniej straszne.

Podobnie, zauważyłem, że z UITableViewRowAnimationTop, wysokość poza tableviews domyślna wysokość komórki pojawia się/znika bez animacji. Więc jeśli tableview wysokość wiersza jest 44, ale animowanie w komórce o wysokości 74, to będzie natychmiast pokazać 30, a następnie animować w pozostałej 44.

Z UITableViewRowAnimationMiddle zawartość komórek ożywia się ładnie, ale Granica komórki jest zniekształcona przez cały czas trwania animacji - początkowo pojawia się w 30, a następnie animuje pozostałe 44.

+0

Jesteśmy w 2017 roku i problem nadal występuje w tableWiews. "Środek" rzeczywiście ożywia treść znacznie bardziej zdrowo niż "Top". – DanBlakemore

Powiązane problemy