目前我正在通过本课学习自定义UICollectionViewLayout:https://www.objc.io/issues/12-animations/collectionview-animations。静态数据一切正常,但是当我尝试删除某个项目时,方法中出现错误' NSRangeException'
layoutAttributesForItemAtIndexPath:
我认为这与获取已删除项目的属性有关,但在删除此项目后会调用它。我试图通过添加额外的变量“removeItem”来解决这个问题。并且它有效,但我不确定这是否是一种常见做法,因为它听起来像是一种解决方法,并希望听到有关此的建议。
主要问题是如何在插入或删除集合视图项时为补充视图设置动画。我在附件中创建了如下布局:
其中单元格是以立方体为中心的边框项目,而补充视图是位于每个单元格下方的彩色视图。对于项目和单元格的动画,我使用以下方法:
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 在我的自定义布局上。那么,有没有办法动画补充意见?提前谢谢。
答案 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
,您需要为所有补充视图构建属性。如果您不再需要某些补充观点,请不要只删除您在
layouInfoDictionary
和layoutAttributesArray
的属性
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
and
- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
为隐藏项目创建适当的属性。在prepareLayout
的下一次迭代中,这些属性将被删除。