我遇到了一个在UICollectionViewController中实现本地拖放的模糊问题.集合视图允许将项目拖入和拖出文件夹.所有外观和工作都很好,直到取消拖动执行.
重现步骤:
取消会话中的项目现在似乎位于其他单元格后面.它们不是真正的细胞,正如可以通过旋转iPad看到的那样,这些"幽灵"细胞不能正确旋转它们背后的真实细胞,它们旋转就好像它们的原点是固定的一样.它们也无法以任何方式进行交互,并且数据源方法不会对它们进行请求.在某些情况下,他们也可以在真实细胞结束后通过向上拉视图来看到它们(在放开后它弹回来隐藏它们).即使大部分真实单元格被拖出集合视图,大量取消的拖动也会导致非常差的滚动性能.
我已经尝试在故事板中重新创建整个UICollectionViewController及其单元格.这不是设置所有单元格属性(我希望它是)的情况,因为鬼影单元格包含所有元素.它们也可以多次覆盖,具体取决于所执行的操作.请看截图.
将数百个项目广泛拖入和拖出集合视图时,未发现任何问题.只有在取消拖动后才会出现问题.
我在这个阶段的最佳猜测是,ghost单元格是取消动画的一部分,在完成时尚未删除.鉴于没有API与拖放动画的交互,我不知道如何测试或修复它.
我在控制器中实现的内容:
我在用什么:
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)