UICollectionView可拖动,并且某个cell不能动

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UICollectionView可拖动,并且某个cell不能动相关的知识,希望对你有一定的参考价值。

参考技术A 第一步给cell添加长按方法

第二步触发的方法

-(void)longclick:(UIGestureRecognizer *)gar

switch (gar.state)





//第三步:设定单位格可移动

-(BOOL)collectionView:(UICollectionView *)collectionView canMoveItemAtIndexPath:(NSIndexPath *)indexPath



//第四步:改变数据源顺序

-(void)collectionView:(UICollectionView *)collectionView moveItemAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath

// FLmodel *model = [_dataSource objectAtIndex:sourceIndexPath.item];
MenuInfoModel *model =[self.dataSource objectAtIndex:sourceIndexPath.item];

[_dataSource removeObject:model];

[_dataSource insertObject:model atIndex:destinationIndexPath.item];

如何禁用 UICollectionView 部分之间的单元格拖动?

【中文标题】如何禁用 UICollectionView 部分之间的单元格拖动?【英文标题】:How can I disable cell dragging between UICollectionView sections? 【发布时间】:2017-06-01 23:06:19 【问题描述】:

我的 UICollectionView 中有两个部分。我希望能够在每个部分内拖动单元格,但不能在它们之间拖动。

我正在使用长按手势识别器来动画单元格拖动移动,以便我可以检查放置位置是否不在不同的部分。有没有办法确定一个部分的框架?

或者有没有更简单的方法?

【问题讨论】:

您可以为单元格重新排序设置分段条件行为 你能举个例子吗? 你能分享你的colectionviewController代码吗,我可以帮你 【参考方案1】:

UICollectionViewDropDelegate,这个协议func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UICollectionViewDropProposal可以帮忙解决。

查看下面的示例,了解我如何防止将项目从一个部分拖到另一部分:

UICollectionViewDragDelegate中,我们使用itemsForBeginning 函数来传递有关对象的信息。可以看到,我把index和item传给了localObject

func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] 
    let item = sectionViewModel[indexPath.section].items[indexPath.row]
    let itemProvider = NSItemProvider(object: item.title as NSString)
    let dragItem = UIDragItem(itemProvider: itemProvider)
    dragItem.localObject = (item, indexPath)
    return [dragItem]

UICollectionViewDropDelegate 中,我这样做了:

func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UICollectionViewDropProposal 
    if let object = session.items.first?.localObject as? (Item, IndexPath), object.0.status, let destinationIndexPath = destinationIndexPath, object.1.section == destinationIndexPath.section 
        let itemAtDestination = sectionViewModel[destinationIndexPath.section].items[destinationIndexPath.row]
        if itemAtDestination.status 
            return UICollectionViewDropProposal(operation: .move, intent: .insertAtDestinationIndexPath)
        
    
    return UICollectionViewDropProposal(operation: .forbidden)

根据Apple:

当用户拖动内容时,collection view 会重复调用此方法来确定如果拖放发生在指定位置,您将如何处理它。集合视图根据您的建议向用户提供视觉反馈。 在此方法的实现中,创建一个 UICollectionViewDropProposal 对象并使用它来传达您的意图。因为在用户拖动表格视图时会重复调用此方法,所以您的实现应该尽快返回。

我做了什么: 我有几个限制:

防止 item.status == true 转到同一部分中的项目 防止项目转到其他部分

GIF

【讨论】:

以上是关于UICollectionView可拖动,并且某个cell不能动的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 方向改变事故?

如何禁用 UICollectionView 部分之间的单元格拖动?

iOS UICollectionView拖动排序

UICollectionView 在单元格上拖动手指以选择它们

如果项目未移动,是不是有方法检查 UICollectionView 项目拖动取消?

iOS 相机应用程序中的可拖动 UIButtons