从 UICollectionView 中删除单元格而不从顶部重新加载 [关闭]

Posted

技术标签:

【中文标题】从 UICollectionView 中删除单元格而不从顶部重新加载 [关闭]【英文标题】:Delete cell from UICollectionView without reloading from top [closed] 【发布时间】:2013-04-24 10:30:46 【问题描述】:

我在我的 ios 应用程序中使用 CollectionView。每个集合单元格都包含一个删除按钮。通过单击按钮,应删除单元格。删除后,该空间将被下面的单元格填充(我不希望重新加载 CollectionView 并再次从顶部开始)

如何使用自动布局从 UICollectionView 中删除特定单元格?

【问题讨论】:

简而言之:您应该遵循 MVC 协议。从模型中删除数据,然后重新加载您的视图。要获得更详细的答案,您应该发布您的代码(仅发布您怀疑问题所在的部分)并描述您已经尝试过的内容......否则您将得到的只是反对票,而不是一个好的答案。需要一个好问题才能得到一个好的答案。阅读FAQ 并没有什么坏处。 【参考方案1】:

UICollectionView 将在删除后动画并自动重新排列单元格。

从集合视图中删除所选项目

[self.collectionView performBatchUpdates:^

    NSArray *selectedItemsIndexPaths = [self.collectionView indexPathsForSelectedItems];

    // Delete the items from the data source.
    [self deleteItemsFromDataSourceAtIndexPaths:selectedItemsIndexPaths];

    // Now delete the items from the collection view.
    [self.collectionView deleteItemsAtIndexPaths:selectedItemsIndexPaths]; 

 completion:nil];



// This method is for deleting the selected images from the data source array
-(void)deleteItemsFromDataSourceAtIndexPaths:(NSArray  *)itemPaths

    NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
    for (NSIndexPath *itemPath  in itemPaths) 
        [indexSet addIndex:itemPath.row];
    
    [self.images removeObjectsAtIndexes:indexSet]; // self.images is my data source


【讨论】:

固定单元格的删除时间如何使动画变慢或变快。 你需要继承 UICollectionViewFlowLayout。特别是实现 finalLayoutAttributForItemAtIndexPath。检查this【参考方案2】:

没有像 UITableviewController 那样向 UICollectionViewController 提供委托方法。 我们可以通过向 UICollectionView 添加一个长手势识别器来手动完成。

 UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self
                                                                                         action:@selector(activateDeletionMode:)];
 longPress.delegate = self;
 [collectionView addGestureRecognizer:longPress];

在 longGesture 方法中,在该特定单元格上添加按钮。

- (void)activateDeletionMode:(UILongPressGestureRecognizer *)gr

    if (gr.state == UIGestureRecognizerStateBegan) 
        if (!isDeleteActive) 
        NSIndexPath *indexPath = [collectionView indexPathForItemAtPoint:[gr locationInView:collectionView]];
        UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
        deletedIndexpath = indexPath.row;
        [cell addSubview:deleteButton];
        [deleteButton bringSubviewToFront:collectionView];
        
     
 

在那个按钮动作中,

- (void)delete:(UIButton *)sender

    [self.arrPhotos removeObjectAtIndex:deletedIndexpath];
    [deleteButton removeFromSuperview];
    [collectionView reloadData];

我认为它可以帮助你。

【讨论】:

[deleteButton bringSubviewToFront:collectionView]; 似乎是一个错误。

以上是关于从 UICollectionView 中删除单元格而不从顶部重新加载 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

通过 NSNotification 从 UICollectionView 中删除单元格

UICollectionView:删除单元格问题

UICollectionView 单元格删除

获取'无效更新:尝试从 UICollectionView 删除单元格时出现异常

如何从集合视图中删除单元格?

从 xib 加载单元格时删除 UICollectionView 中的边框