删除

时间:2015-12-04 09:07:03

标签: objective-c uicollectionviewlayout

我几天来一直在修补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的值的位置。这意味着我可以完全摆脱该成员变量。它没有任何奇怪的副本,它会动画并消失。

0 个答案:

没有答案