2013-11-22 4 views
9

Mam widok kolekcji i wybieram efekt, w którym po kliknięciu na komórkę pojawia się cały ekran. Aby to osiągnąć, zasadniczo nazywam po prostu performBatchUpdates wewnątrz didSelectItemAtIndexPath, a sizeForItemAtIndexPath wie, aby zwrócić większy rozmiar dla wybranej komórki. To wszystko działa całkiem dobrze, komórka rośnie i kurczy się zgodnie z oczekiwaniami.Jak animować wewnętrzne widoki komórki widoku kolekcji podczas zmiany jej rozmiaru?

Problem dotyczy wnętrza komórki. Komórka widoku kolekcji składa się z umiarkowanie złożonej hierarchii widoków zarządzanej przez wiązania. Chcę, aby podrzędne widoki komórki rosły i zmniejszały się wraz z animującą komórką. Niestety, moje subviews są natychmiast przyciągane do nowej pozycji, ponieważ komórka powoli animuje się do nowego rozmiaru. Jak mogę sprawdzić, czy zawartość komórki animuje się rozmiarem komórki?

Oto dwa odpowiednie metody z kontrolera widoku kolekcji:

- (CGSize) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
if ([collectionView.indexPathsForSelectedItems containsObject:indexPath]) 
    return CGSizeMake(collectionView.bounds.size.width - 20, collectionView.bounds.size.height - (20 + [self.topLayoutGuide length])); 
else 
    return CGSizeMake(260, 100); 
} 

- (void) collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 
    [collectionView performBatchUpdates:nil completion:nil]; 
} 
+1

Twoje podopcje są przyciągane do miejsca najprawdopodobniej dlatego, że jakaś flaga oznaczająca rozszerzaną komórkę przełącza się z wartości false na true, a następnie wywoływana jest komenda 'layoutSubviews', która natychmiast przenosi subviews do ich rozwiniętych pozycji. Zgaduję jednak - jeśli dodasz kod, będziemy mogli zobaczyć, czy tak jest. Inna uwaga - czy komórka powinna się rozwinąć ponad inne komórki w kolekcji, czy też powinna odepchnąć je na bok? Jeśli powinien się rozwinąć, polecam dodać nowy widok nad UICollectionView i ożywić go. – Ian

+0

Dodałem dwie odpowiednie metody, które zmieniają rozmiar w zaznaczeniu. W kontrolerze widoku jest bardzo mało innych kodów. Sama komórka to kilka plików końcówek, nic, co mogę łatwo dodać do postu. – Mike

Odpowiedz

11

miałem dokładnie ten sam problem. Po wielu próbach poniższy kod mi pomógł. Wywołanie layoutIfNeed bezpośrednio po aktualizacji pakietu o czas 3,0 (+ - czas trwania partii wsadowej) spowodowało animację ograniczeń.

[self performBatchUpdates:nil completion:nil]; 

// IndexPath of cell to be expanded 
UICollectionViewCell *cell = [self cellForItemAtIndexPath:indexPath]; 
[UIView animateWithDuration:0.3 animations:^{ 
    [cell.contentView layoutIfNeeded]; 
}]; 
+0

Dzięki, że uratowałeś mnie od wściekłości tutaj. – logancautrell

+0

tak, to działa, użyłem go rozwiązał ten sam problem – Sherlock

2

Chciałbym rozwinąć odpowiedź Antoine'a. Wywołanie performBatchUpdates:completion: w bloku animacji spowoduje ustawienie czasu trwania zmiany rozmiaru komórki i dopasowanie jej rozmiaru do rozmiaru.

[UIView animateWithDuration:0.3 animations:^{ 
    [self performBatchUpdates:^{ 
     // set flags needed for new cell size calculation 
    } completion:nil]; 
    [collectionView layoutIfNeeded]; 
}]; 

W ten sposób można również odtwarzać z animacją, a nawet korzystać z wiosennych animacji.