2015-08-13 4 views
1

У меня есть UICollectionView, который является subview из UIScrollView (это требуется из-за материала, выше и ниже точки зрения сбора.Анимационные изменение высоты UICollectionView

Во всяком случае ...

Представление коллекции показывают три элемента в строку и только два ряд, чтобы начать с.

первые пяти пунктов фактическими деталей, а последний элементом является «См Больше» деталью.

Когда последний элемент пр essed изменить количество отображаемых элементов и обновить представление коллекции ...

NSMutableArray *indexPaths = [NSMutableArray array]; 

for (int i = 5 ; i<self.facilities.count ; i++) { 
    [indexPaths addObject:[NSIndexPath indexPathForItem:i inSection:0]]; 
} 

// changing the tableCollapsed bool updates the number of items 
if (self.isTableCollapsed) { 
    self.tableCollapsed = NO; 
    [self.collectionView insertItemsAtIndexPaths:indexPaths]; 
} else { 
    self.tableCollapsed = YES; 
    [self.collectionView deleteItemsAtIndexPaths:indexPaths]; 
} 

тогда я бегу ...

[self setHeightAnimated:YES]; 

Что делает это ...

- (void)setHeightAnimated:(BOOL)animated 
{ 
    NSInteger numberOfRows = (NSInteger) ceilf((CGFloat)[self getNumberOfItems]/self.numberOfItemsPerRow); 

    self.heightConstraint.constant = numberOfRows * self.rowHeight; 

    if (animated) { 
     [UIView animateWithDuration:0.2 
         animations:^{ 
          [self layoutIfNeeded]; 
         }]; 
    } else { 
     [self layoutIfNeeded]; 
    } 
} 

Этот всегда работает и устанавливает правильную высоту и получает правильное значение animated, когда оно должно быть YES или NO. Однако он никогда не оживляет. Он сразу переключается на новую высоту.

Я предполагаю, что это из-за какого-то кода макета, который запускается или что-то в этом роде, но мне было интересно, знает ли кто, как это сделать, чтобы высота правильно изменилась с указанной мной анимацией.

Thanks

ответ

0

OK! Через пару часов я нашел решение.

Я переместил блок вставки в метод, как это ...

- (void)addItemsAtIndexPaths:(NSArray *)indexPaths { 
    [UIView performWithoutAnimation:^{ 
     [self.collectionView insertItemsAtIndexPaths:indexPaths]; 
    }]; 
    [self setHeightAnimated:YES completion:nil]; 
} 

При этом используется метод, который я не знал о performWithoutAnimation добавлять элементы в представлении коллекции. Затем я изменяю высоту независимо от этого.

Работает как очарование.

Реверс также работает ...

- (void)removeItemsAtIndexPaths:(NSArray *)indexPaths { 
    [self setHeightAnimated:YES completion:^(BOOL finished) { 
     [UIView performWithoutAnimation:^{ 
      [self.collectionView deleteItemsAtIndexPaths:indexPaths]; 
     }]; 
    }]; 
} 

Это оживляет высоту первого, а затем удаляет элементы без анимации.

Смежные вопросы