从集合视图中删除项目
Posted
技术标签:
【中文标题】从集合视图中删除项目【英文标题】:Deleting Items out of collection view 【发布时间】:2017-03-28 04:03:10 【问题描述】:我目前创建了一组图像 [1 - 8]。我还创建了一个集合视图,它从 imageArray 中提取图像并将图像放入单元格中的 imageview 中。请注意,该单元格中有一个 imageView,它占据了整个屏幕,水平滚动和分页都启用了。
现在我拥有的当前代码非常奇怪,目前正在发生什么,所以我会告诉你目前正在发生什么。那么当前正在发生什么(我将通过图像 1 索引 0)如果图像在 2(索引 1)上,然后您在 3(索引 2)旁边滑动,它会跳过图像 3(索引 2)和 4(索引 3) 并位于图像 5(索引 4)上,所以当我的意思是跳过时,我的意思是它滑过你刚刚滑动到的图像,然后再滑过一个。
(奇怪的是它在 5 上删除了图像 1 和 2)。我相信这是因为它正在更新索引或将其再次设置为 2,因为它刚刚删除了 0。我知道这可能很难得到但是只需考虑带有分页的滚动视图,当您滑动到第三张图像时,它会跳过您打开的一张和另一张,然后将您滑动到它所在位置的图像 5。
到目前为止,感谢你们中的一些人,我在下面想出了这段代码,但我希望有人能够解决这个可怕的混乱。
var currentImage = 0
func scrollViewDidScroll(_ scrollView: UIScrollView)
let x = floor(myCollectionView.contentOffset.x / view.frame.width)
if Int(x) != currentImage
currentImage = Int(x)
if currentImage > 1
for collectionCell in myCollectionView.visibleCells as [UICollectionViewCell]
let visibleCells = myCollectionView.visibleCells
if visibleCells.first != nil
if let indexPath = myCollectionView.indexPath(for: collectionCell as UICollectionViewCell)
let indexPathOfLastItem = (indexPath.item) - 1
let indexPathOfItemToDelete = IndexPath(item: (indexPathOfLastItem), section: 0)
imageArray.remove(at: (indexPath.item) - 1)
myCollectionView.deleteItems(at: [indexPathOfItemToDelete])
【问题讨论】:
显示一些视频或用户滚动时需要执行的操作 好的,请稍等。 请问,你为什么要删除最后一张图片? 解释一下你需要实现更多一点的东西......当滚动停止或持续滚动时你需要删除单元格吗? 嗯,我只是在滚动停止时删除单元格。至少我想做的事 【参考方案1】:这些代码将使用项目索引删除特定项目。这很好用!
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView)
var visibleRect = CGRect()
visibleRect.origin = myCollectionView.contentOffset
visibleRect.size = myCollectionView.bounds.size
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
let visibleIndexPath: IndexPath = myCollectionView.indexPathForItem(at: visiblePoint)!
print(visibleIndexPath)
fruitArray.remove(at: visibleIndexPath.row )
myCollectionView.deleteItems(at: [visibleIndexPath])
myCollectionView.scrollToItem(at: IndexPath.init(row: visibleIndexPath.row-1, section: 0), at: UICollectionViewScrollPosition.centeredHorizontally, animated: false)
【讨论】:
这个是在我目前拥有的scrollviewdidscroll下实现还是分开实现? 您可以在任何地方使用它。只需传递要删除的项目的索引。例如,您想删除第 5 行的项目,您只需以这种方式调用该方法 --> deleteItemAtIndex(5) 。 @user7424546 对于用户所在的每个项目,它前面的项目(最后一次查看)将被删除。删除某个索引处的项目(5)对我没有帮助,因为它只会删除 6 之前的项目。 我无法成功地使用它来解决我的问题 我编辑了我的答案,请检查一下。它可能会有所帮助。 @user7424546【参考方案2】:使用 scrollViewDidEndDragging 来检测用户何时停止滚动并删除单元格,..
目标 C
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
// if decelerating, let scrollViewDidEndDecelerating: handle it
if (decelerate == NO)
[self deleteCell];
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
[self deleteCell];
- (void)deleteCell
NSIndexPath *pathForCenterCell = [self.tableView indexPathForRowAtPoint:CGPointMake(CGRectGetMidX(self.tableView.bounds), CGRectGetMidY(self.tableView.bounds))]; // if you want middle cell
NSIndexPath *firstVisibleIndexPath = [[self.tableView indexPathsForVisibleRows] objectAtIndex:0]; // if you want first visible cell
NSIndexPath *lastVisibleIndexPath = [[self.tableView indexPathsForVisibleRows] objectAtIndex:[self.tableView indexPathsForVisibleRows].count]; // last cell in visible cells
myCollectionView.beginUpdates() //if you are performing more than one operation use this
yourImage.removeObjectAtIndex(myNSIndexPath.row)
myCollectionView.deleteItems(at: [lastVisibleIndexPath])
myCollectionView.endUpdates()
Swift 3.0
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool)
// if decelerating, let scrollViewDidEndDecelerating: handle it
if decelerate == false
deleteCell()
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView)
deleteCell()
func deleteCell()
var pathForCenterCell: IndexPath? = tableView.indexPathForRow(at: CGPoint(x: CGFloat(tableView.bounds.midX), y: CGFloat(tableView.bounds.midY)))
// if you want middle cell
var firstVisibleIndexPath: IndexPath? = (tableView.indexPathsForVisibleRows?[0] as? IndexPath)
// if you want first visible cell
var lastVisibleIndexPath: IndexPath? = (tableView.indexPathsForVisibleRows?[tableView.indexPathsForVisibleRows?.count] as? IndexPath)
// last cell in visible cells
myCollectionView.beginUpdates()()
//if you are performing more than one operation use this
yourImage.removeObjectAtIndex(myNSIndexPath.row)
myCollectionView.deleteItems
愉快的编码
【讨论】:
如果是swift的话就好了,我可以尝试转换一下。 还添加了 swift 版本。 好的,我正在检查这个,只需将 tableview 更改为 collectionView 是的,嗯,您知道您是否可以将答案更改为 collectionView? 我需要将tableView声明为uitableviewcontroller并添加委托和数据源吗?因为它目前说的是未解析的标识符 tableView以上是关于从集合视图中删除项目的主要内容,如果未能解决你的问题,请参考以下文章
如何在要删除的单元格上使用 longtapGesture 从集合视图中删除 uicollectionviewcell?迅速