我几天来一直在修补UICollectionViewLayout,似乎一直停留在使用finalLayoutAttributesForDisappearingSupplementaryElementOfKind:atIndexPath:
我终于取得了一些进展并发现了这个问题。最初它看起来好像不是动画,因为我没有得到一个褪色动画。所以我在它上面添加了一个变换来让它旋转......并且发现补充视图实际上是动画的,但另一个只是坐在那里。直到它完成并毫不客气地消失,不会被告知完全消失。总而言之,它看起来像一个精确的副本,并为finalLayoutAttributesForDisappearingSupplementaryElementOfKind:atIndexPath:
制作动画,原始只是坐在那里不动和动画,然后都消失。
在我滚动视图之前,此副本或其他任何内容都不会消失。
有没有人对此问题有任何见解?
因此经过一些调整,实验和许多假设后来导致问题的原因,结果证明罪魁祸首就是这种方法
- (NSArray *)indexPathsToDeleteForSupplementaryViewOfKind:(NSString *)kind
{
NSMutableArray *deletedIndexPaths = [NSMutableArray new];
[self.updatedItems enumerateObjectsUsingBlock:^(UICollectionViewUpdateItem *updateItem, NSUInteger idx, BOOL * _Nonnull stop)
{
switch (updateItem.updateAction)
{
case UICollectionUpdateActionInsert:
{
if (_unReadHeaderIndexPath != nil && [self.layoutInformation[ChatroomLayoutElementKindUnreadHeader] count] == 0)
{
[deletedIndexPaths addObject:_unReadHeaderIndexPath];
_unReadHeaderIndexPath = nil;
}
}
break;
case UICollectionUpdateActionDelete:
{
[deletedIndexPaths addObject:updateItem.indexPathBeforeUpdate];
}
break;
default:
break;
}
}];
return deletedIndexPaths;
}
要关注的部分是
if (_unReadHeaderIndexPath != nil && [self.layoutInformation[ChatroomLayoutElementKindUnreadHeader] count] == 0)
{
[deletedIndexPaths addObject:_unReadHeaderIndexPath];
_unReadHeaderIndexPath = nil;
}
特别是_unReadHeaderIndexPath = nil;
这样做会使补充视图消失,当用户插入任何文本然后将其设置为nil时指示未读消息,因此不会多次添加,逻辑是正确的但是采用的方法似乎是问题。
indexPathsToDeleteForSupplementaryViewOfKind:
被多次调用,人们可以假设它需要多次传递才能正常工作但是因为我们没有_unReadHeaderIndexPath;
它似乎没有被添加到返回的数组中适当的时候。
当我在方法名称indexPathsToDeleteForSupplementaryViewOfKind:
中检查插入操作时,它似乎也是不正确的方法,因此解决方案是将所有逻辑移动到方法
prepareForCollectionViewUpdates:
我们最初设置self.updatedItems
的值的位置。这意味着我可以完全摆脱该成员变量。它没有任何奇怪的副本,它会动画并消失。