18

Chciałbym dostosować style animacji po wstawieniu i/lub usunięciu UICollectionViewCell.Animacje UICollectionView (wstawianie/usuwanie pozycji)

Powodem, dla którego tego potrzebuję jest to, że domyślnie widzę, że wstawianie komórki ma płynne zanikanie w animacji, jednak usunięcie komórki ma kombinację animacji przesunięcia w lewo i zaniku. Byłbym bardzo szczęśliwy z tego, gdyby nie jeden problem.

Po usunięciu komórki, jest ona ponownie wykorzystywana po dodaniu nowych, a po ponownym użyciu jest dodawana nie do domyślnego efektu zanikania, ale zamiast tego jest kombinacją przesunięcia w lewo + zanikania w

Nie jestem pewien, dlaczego dostaję tę niespójność w animacjach. Jeśli jest to znany błąd/problem/głupota (po mojej stronie :)), proszę dać mi znać, jak to naprawić.

W przeciwnym razie, daj mi znać, jak ustawić niestandardowe animacje po usunięciu komórki (lub skieruj mnie do samouczka).

Dzięki

UPDATE

Naprawiono dziwne zachowanie animacji przez instacji UICollectionViewFlowLayout i dodanie tej linii kodu

- (UICollectionViewLayoutAttributes *) initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath { 

     return nil; 
} 

to jest to! :)

Odpowiedz

24

Jeśli używasz własnego podklasę UICollectionViewLayout można wdrożyć metody:

  • initialLayoutAttributesForAppearingItemAtIndexPath: dla wstawkami

  • finalLayoutAttributesForDisappearingItemAtIndexPath: dla delecji

zgodnie z dokumentacją , zwracane atrybuty są używane jako punkty początkowe animacji, a punkt końcowy jest normą al atrybuty zwracane przez twój układ (lub przeciwny do usunięcia). Atrybuty układu to pozycja, alfa, transformacja ... Oczywiście, więcej pracy to napisanie własnej klasy układu niż użycie układu przepływu dostarczonego przez firmę Apple.

Edytuj: Aby odpowiedzieć na twoje pytanie w komentarzach, oto superpodstawowa implementacja układu dla wierszy pozycji, które są tego samego rozmiaru.

Komórka ma frame i domyślnie alpha z 1.0 (zgodnie z definicją layoutAttributesForItemAtIndexPath:). Po usunięciu jego właściwości zostaną animowane z bieżącego stanu przed usunięciem do właściwości ustawionych przez finalLayoutAttributesForDisappearingItemAtIndexPath:, które odpowiadają temu samemu frame i alpha z 0.0. Więc się nie ruszy, ale zniknie. Jednak komórki po prawej stronie zostaną przesunięte w lewo (ponieważ zmienił się ich indexPath, a tym samym ich frame zgodnie z ustawieniem layoutAttributesForItemAtIndexPath:).

- (CGSize)collectionViewContentSize 
{ 
    NSInteger numberOfItems = [self.collectionView numberOfItemsInSection:0]; 
    return CGSizeMake(numberOfItems * ITEM_WIDTH, ITEM_HEIGHT); 
} 

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSUInteger index = [indexPath indexAtPosition:0]; 
    UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; 
    attributes.frame = CGRectMake(index * ITEM_WIDTH, 0, ITEM_WIDTH, ITEM_HEIGHT); 
    return attributes; 
} 

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 
{ 
    NSMutableArray *attributes = [NSMutableArray new]; 
    NSUInteger firstIndex = floorf(CGRectGetMinX(rect)/ITEM_WIDTH); 
    NSUInteger lastIndex = ceilf(CGRectGetMaxX(rect)/ITEM_WIDTH); 
    for (NSUInteger index = firstIndex; index <= lastIndex; index++) { 
     NSIndexPath *indexPath = [[NSIndexPath alloc] initWithIndexes:(NSUInteger [2]){ 0, index } length:2]; 
     [attributes addObject:[self layoutAttributesForItemAtIndexPath:indexPath]]; 
    } 
    return attributes; 
} 

- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForItemAtIndexPath:indexPath]; 
    attributes.alpha = 0.0; 
    return attributes; 
} 
+0

Dzięki Guillaume. Ale czy mógłbyś podać mi konkretny przykład? Powiedzmy, że chcę się upewnić, że moja komórka po prostu zanika, gdy zostanie usunięta, w jaki sposób mogę ją zaimplementować w moim niestandardowym UICollectionViewLayout? –

+0

Dodałem przykład w odpowiedzi na twoje pytanie. – Guillaume

5

Pobierz circle Layout.Jest to przykładowy układ niestandardowy, który będzie dla Ciebie dobrym materiałem roboczym.