2012-01-09 1 views
7

Dokonuję zmian w tableView za pomocą bloku beginUpdates/endUpdates. Przez cały czas muszę aktualizować cień, aby odzwierciedlał aktualny skład tableView.UITableView beginUpdates/endUpdates callback

Próbowałem skonfigurować KVO dla tableView's contentSize, ale jest on wywoływany tylko na endUpdates, po zakończeniu animacji. To, czego chcę, to wywoływać za każdym razem zmiany contentSize (nawet jeśli jest to tylko piksel). Czy jest jakiś sposób, aby to osiągnąć?

Odpowiedz

0

Przykro mi to mówić, nie sądzę, że możesz to zrobić. Po wprowadzeniu zmian w tabeli po wywołaniu beginUpdates zmiany są animowane jako pojedyncza animacja po endUpdates. Podczas animacji nie ma animowanych wywołań zwrotnych. Nie próbowałem tego, więc nie wiem, czy to by się dobrze sprawdziło, ale możesz spróbować zagnieżdżać beginUpdates i endUpdates i aktualizować swój cień po każdym endUpdates.

+2

Wystarczy FYI: wywołań beginUpdates i endUpdates mogą być zagnieżdżone. Jeśli nie wykonasz wstawiania, usuwania i wywołań wyboru wewnątrz tego bloku, atrybuty tabeli, takie jak liczba wierszy, mogą stać się nieprawidłowe. –

+0

Czy masz przykład, w jaki sposób należy używać połączeń zagnieżdżonych? – Rivera

24

Co z tym?

[CATransaction begin]; 

[CATransaction setCompletionBlock:^{ 
    // animation has finished 
}]; 

[tableView beginUpdates]; 
// do some work 
[tableView endUpdates]; 

[CATransaction commit]; 
+0

który zrobił to dla mnie! dzięki! – horseshoe7

+1

wow! który prawie działa, ale między widokiem tabeli kończącym aktualizacje a uruchomionym blokiem występuje opóźnienie. Na razie to wykorzystam. Dzięki. – SpaceDog

1

Metoda Rudolfa nie sprawdziła się tak gładko, jak się spodziewałem. W moim przypadku wybrałem wiersz przy użyciu UITableView, a metoda Rudolfa spowodowała, że ​​stół wykonał dwie animacje z niewielkim zamrożeniem: animacja wewnątrz beginUpdates/endUpdates, trochę zamrożenia i animacja na bloku zakończenia.

[tableView selectRowAtIndexPath:indexPath 
         animated:YES 
        scrollPosition:scrollPosition]; 

że zainspirowało mnie do stworzenia tego kodu ... i to działa płynnie:

[UIView animateWithDuration:0.0 animations:^{ 
    [tableView beginUpdates]; 
    // do something to the table 
    [tableView endUpdates]; 
} completion:^(BOOL finished) { 
    // Code to run when table updates are complete. 
}];