ios - horizontal - uicollectionview swift




UICollectionView: изменение размера ячейки для анимации при выборе (6)

Я хочу изменить размер UICollectionViewCell и оживить это изменение, когда ячейка выбрана. Я уже успел сделать это без изменений, отметив ячейку, выбранную в collectionView: didSelectItemAtIndexPath: а затем вызывая reloadData на моем UICollectionView, отображая выбранную ячейку разного размера.

Тем не менее, это происходит сразу, и я не знаю, как получить это изменение в анимированном размере. Есть идеи?

Я уже нашел Animate uicollectionview клетки при отборе , но ответ был неспецифичным для меня, и я еще не понял, может ли он помочь мне в моем случае.


Анимация размера ячейки работает так же, как и для представлений коллекции, как и для табличных представлений. Если вы хотите оживить размер ячейки, у вас есть модель данных, которая отражает состояние ячейки (в моем случае я просто использую флаг (CollectionViewCellExpanded, CollectionViewCellCollapsed) и соответственно возвращать CGSize.

Когда вы вызываете и пустите вызов executeBathUpdates, просмотр автоматически анимируется.

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    [collectionView performBatchUpdates:^{
        // append your data model to return a larger size for
        // cell at this index path
    } completion:^(BOOL finished) {

    }];
}

Использование executeBatchUpdates не будет анимировать макет содержимого ячейки. Вместо этого вы можете использовать следующее:

    collectionView.collectionViewLayout.invalidateLayout()

    UIView.animate(
        withDuration: 0.4,
        delay: 0.0,
        usingSpringWithDamping: 1.0,
        initialSpringVelocity: 0.0,
        options: UIViewAnimationOptions(),
        animations: {
            self.collectionView.layoutIfNeeded()
        },
        completion: nil
    )

Это дает очень плавную анимацию.

Это похоже на ответ Игнатия Тремора, но анимация перехода не работает должным образом для меня.

См. https://github.com/cnoon/CollectionViewAnimations для полного решения.


У меня были успешные анимационные изменения, используя -setCollectionViewLayout:animated: для создания нового экземпляра того же макета представления коллекций.

Например, если вы используете UICollectionViewFlowLayout , тогда:

// Make sure that your datasource/delegate are up-to-date first

// Then animate the layout changes
[collectionView setCollectionViewLayout:[[UICollectionViewFlowLayout alloc] init] animated:YES];

Хорошим способом анимировать размер ячейки является переопределение isSelected в самом наборе коллекции.

class CollectionViewCell: UICollectionViewCell {

    override var isHighlighted: Bool {
        didSet {
            if isHighlighted {
                UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseOut, animations: {
                    self.transform = CGAffineTransform(scaleX: 0.95, y: 0.95)
                }, completion: nil)
            } else {
                UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseOut, animations: {
                    self.transform = CGAffineTransform(scaleX: 1, y: 1)
                }, completion: nil)
            }
        }
    }

}

Это сработало для меня.

    collectionView.performBatchUpdates({ () -> Void in
        let ctx = UICollectionViewFlowLayoutInvalidationContext()
        ctx.invalidateFlowLayoutDelegateMetrics = true
        self.collectionView!.collectionViewLayout.invalidateLayoutWithContext(ctx)
    }) { (_: Bool) -> Void in
    }

[UIView transitionWithView:collectionView 
                  duration:.5 
                   options:UIViewAnimationOptionTransitionCurlUp 
                animations:^{

    //any animatable attribute here.
    cell.frame = CGRectMake(3, 14, 100, 100);

} completion:^(BOOL finished) {

    //whatever you want to do upon completion

}];

Поиграйте с чем-то в этих строках внутри вашего метода didselectItemAtIndexPath.





uicollectionview