小编Der*_*ard的帖子

取消拖动会话后,UICollectionView单元格会重复显示

我遇到了一个在UICollectionViewController中实现本地拖放的模糊问题.集合视图允许将项目拖入和拖出文件夹.所有外观和工作都很好,直到取消拖动执行.

重现步骤:

  1. 在拖动会话中收集多个项目.
  2. 取消拖动,例如移动到屏幕边缘.
  3. 在拖动会话中收集多个项目(可以包含上面取消的一些项目).
  4. 将项目放入集合视图的更上方的文件夹中,以便会话中删除的项目导致重新定位已取消的拖动中的项目.

取消会话中的项目现在似乎位于其他单元格后面.它们不是真正的细胞,正如可以通过旋转iPad看到的那样,这些"幽灵"细胞不能正确旋转它们背后的真实细胞,它们旋转就好像它们的原点是固定的一样.它们也无法以任何方式进行交互,并且数据源方法不会对它们进行请求.在某些情况下,他们也可以在真实细胞结束后通过向上拉视图来看到它们(在放开后它弹回来隐藏它们).即使大部分真实单元格被拖出集合视图,大量取消的拖动也会导致非常差的滚动性能.

我已经尝试在故事板中重新创建整个UICollectionViewController及其单元格.这不是设置所有单元格属性(我希望它是)的情况,因为鬼影单元格包含所有元素.它们也可以多次覆盖,具体取决于所执行的操作.请看截图.

将数百个项目广泛拖入和拖出集合视图时,未发现任何问题.只有在取消拖动后才会出现问题.

我在这个阶段的最佳猜测是,ghost单元格是取消动画的一部分,在完成时尚未删除.鉴于没有API与拖放动画的交互,我不知道如何测试或修复它.

我在控制器中实现的内容:

  1. itemsForBeginningDragSession和itemsForAddingToDragSession,它们都将单个NSItemProvider添加到返回的数组中.
  2. dragPreviewParametersForItemAtIndexPath设置可见路径.(删除此方法对问题没有影响)
  3. 如果会话不是本地会话,dropSessionDidUpdate将返回UIDropOperationMove,UICollectionViewDropIntentInsertIntoDestinationIndexPath或UIDropOperationForbidden.
  4. performDropWithCoordinator使用performBatchUpdates并为每个项调用dropItem.(问题仍然存在,没有dropItem和一个脏集合视图reloadSections!)

我在用什么:

Xcode 9.2,iOS 11.2和11.2.5的各种iPad

我现在已经坚持了五天,所以任何指向正确方向的人都会非常感激.

细胞重叠两次(三种情况下相似的图像):

细胞重叠两次

细胞重叠三次(第一个细胞有三个独特的图像):

在此输入图像描述

细胞多次重叠:

在此输入图像描述

下面是将文件拖动到现有文件夹的简单案例的代码,因为这使源更容易遵循:

#pragma mark - UICollectionViewDragDelegate

- (nonnull NSArray<UIDragItem *> *)collectionView:(nonnull UICollectionView *)collectionView itemsForBeginningDragSession:(nonnull id<UIDragSession>)session atIndexPath:(nonnull NSIndexPath *)indexPath
{
    return [self itemsForDragSession:session atIndexPath:indexPath];
}

- (NSArray<UIDragItem *> *)collectionView:(UICollectionView *)collectionView itemsForAddingToDragSession:(id<UIDragSession>)session atIndexPath:(NSIndexPath *)indexPath point:(CGPoint)point
{
    return [self itemsForDragSession:session atIndexPath:indexPath];
}

- (nonnull NSArray<UIDragItem *> *)itemsForDragSession:(nonnull id<UIDragSession>)session atIndexPath:(nonnull NSIndexPath *)indexPath
{
    NSMutableArray<UIDragItem *> *dragItems = [NSMutableArray array];

    if (self.isEditing)
    { …
Run Code Online (Sandbox Code Playgroud)

drag-and-drop objective-c ios uicollectionview ios11

8
推荐指数
0
解决办法
795
查看次数