Анимация изменений в collectionView Insets

У меня есть небольшой collectionView с 2 ячейками. Это центрировано на экране по вертикали. Когда пользователь выбирает ячейку, новая ячейка появляется в представлении коллекции, и представление коллекции меняет свои вставки в соответствии с 3 средними ячейками по вертикали на экране. Однако это изменение не плавное, а скачкообразное. Есть ли способ анимировать изменение вставки collectionView?

   -(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect {
    NSArray* array = [super layoutAttributesForElementsInRect:rect];

    UICollectionViewLayoutAttributes* att = [array lastObject];
    if (att){
        CGFloat lastY = att.frame.origin.y + att.frame.size.height;
        CGFloat diff = self.collectionView.frame.size.height - lastY;
        if (diff > 0){
            UIEdgeInsets contentInsets = UIEdgeInsetsMake(diff/2, 0.0, 0.0, 0.0);
            self.collectionView.contentInset = contentInsets;
        }
        self.diff = diff;
    }
    return array;
}

person ila    schedule 21.04.2014    source источник


Ответы (2)


Казалось невозможным анимировать вставки collectionView без создания пользовательских UICollectionViewLayout, поэтому я изменил логику и реализовал изменение положения ячейки вместо изменения вставок представления коллекции. Это дает реальную плавную анимацию!

-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect {
    NSArray* array = [super layoutAttributesForElementsInRect:rect];

    UICollectionViewLayoutAttributes* att = [array lastObject];
    if (att){
        CGFloat lastY = att.frame.origin.y + att.frame.size.height;
        CGFloat diff = self.collectionView.frame.size.height - lastY;
        if (diff > 0){
            for (UICollectionViewLayoutAttributes* a in array){
                a.frame = CGRectMake(a.frame.origin.x, a.frame.origin.y + diff/2, a.frame.size.width, a.frame.size.height) ;
            }
        }
    }
    return array;
}
person ila    schedule 23.04.2014

Похоже, что ответ ila больше не является точным с iOS 12 - следующий код показывает анимацию изменения вставки для меня:

if !disableCustomInsets {
    UIView.animate(withDuration: 0.2, animations: {
        self.disableCustomInsets = true
        self.collectionViewLayout.invalidateLayout()
    }, completion: nil)
}
person joel.d    schedule 24.09.2019