动画UICollectionView的高度变化

时间:2015-08-13 14:41:49

标签: ios objective-c autolayout uicollectionview

我的UICollectionViewsubview的{​​{1}}(由于集合视图上方和下方的内容,这是必需的。

总之...

集合视图每行显示三个项目,开始时只显示两行。

前五项是实际项目,最后一项是“查看更多”项目。

当按下最后一项时,我更改显示的项目数并更新集合视图......

UIScrollView
然后我跑了......

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的正确值。但是,它永远不会动画。它只是立即切换到新的高度。

我猜这是因为运行了一些布局代码或者其他什么,但我想知道是否有人知道如何最好地做到这一点,以便高度根据我指定的动画正确改变。

由于

1 个答案:

答案 0 :(得分: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];
        }];
    }];
}

首先设置高度动画,然后删除没有动画的项目。