插入/删除补充视图的动画

时间:2016-05-05 18:07:29

标签: ios objective-c animation uicollectionview uicollectionviewlayout

目前我正在通过本课学习自定义UICollectionViewLayout:https://www.objc.io/issues/12-animations/collectionview-animations。静态数据一切正常,但是当我尝试删除某个项目时,方法中出现错误' NSRangeException'

  

layoutAttributesForItemAtIndexPath:

我认为这与获取已删除项目的属性有关,但在删除此项目后会调用它。我试图通过添加额外的变量“removeItem”来解决这个问题。并且它有效,但我不确定这是否是一种常见做法,因为它听起来像是一种解决方法,并希望听到有关此的建议。

主要问题是如何在插入或删除集合视图项时为补充视图设置动画。我在附件中创建了如下布局:my layout

其中单元格是以立方体为中心的边框项目,而补充视图是位于每个单元格下方的彩色视图。对于项目和单元格的动画,我使用以下方法:

SELECT term_taxonomy_id
FROM wp_term_relationships
WHERE object_id = 8 AND 
      object_id NOT IN (SELECT term_taxonomy_id
                        FROM wp_term_relationships
                        WHERE object_id IN (1, 2, 3, 4, 5)
                       )

例如,插入一个项目,我使用标准方法:

-(UICollectionViewLayoutAttributes*)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath {
UICollectionViewLayoutAttributes *attr = [self layoutAttributesForItemAtIndexPath:itemIndexPath];

attr.transform = CGAffineTransformRotate(CGAffineTransformMakeScale(0.2, 0.2), M_PI);
attr.center = CGPointMake(CGRectGetMidX(self.collectionView.bounds), CGRectGetMaxY(self.collectionView.bounds));

return attr;
}
-(UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingSupplementaryElementOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)elementIndexPath {...}
-(UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)itemIndexPath {...}
-(UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingSupplementaryElementOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)elementIndexPath {...}

这导致正确的项目动画,但补充视图只显示没有动画。当我打电话

[self.sampleCollectionView insertItemsAtIndexPaths:@[indexPath]];

补充视图不仅没有删除动画,而且在我开始滚动或调用后仍然可见并被删除     的invalidateLayout 在我的自定义布局上。那么,有没有办法动画补充意见?提前谢谢。

1 个答案:

答案 0 :(得分:0)

要删除补充意见,请使用

- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingSupplementaryElementOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)elementIndexPath {
    UICollectionViewLayoutAttributes *attributes = [super finalLayoutAttributesForDisappearingSupplementaryElementOfKind:elementKind atIndexPath:elementIndexPath];
    attributes.alpha = 0;
    return attributes;
}

动画消失的一种方法我发现 -

中的动画块
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath  

必须与某些KVO(看起来像黑客)绑定到视图

<强> -----

另一种方法可能是覆盖prepareLayout,您需要为所有补充视图构建属性。如果您不再需要某些补充观点,请不要只删除您在

中使用的layouInfoDictionarylayoutAttributesArray的属性
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
and 
- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath

为隐藏项目创建适当的属性。在prepareLayout的下一次迭代中,这些属性将被删除。