项目开发中遇到拖拽功能的需求,具体要求是在编辑状态下,首页底部菜单项可以拖动位置,便于位置切换。遇到问题后的初步想法是添加拖拽手势,拖拽到某个位置,判断拖拽cell的中心点是否在另一个cell内,这样处理比较复杂,需要自己计算坐标。后经一同事推荐,找到了一个更简单的解决方案,代码如下。

//1、给cell添加长按手势,在编辑状态下可用,非编辑状态下不可用

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

CCNewMoreMenuCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CCNewMoreMenuCellIdentifier forIndexPath:indexPath];

CCHighSeasPoolManager *seas=[CCHighSeasPoolManager sharedManager];

//添加长按手势

UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)];

[cell addGestureRecognizer:longPressGesture];

if (seas.isEdit) {

[cell.btnDelete setHidden:NO];

[cell.imageDelete setHidden:NO];

[cell.btnMenu setHidden:YES];

longPressGesture.cancelsTouchesInView=YES;

//编辑状态开启手势

longPressGesture.enabled=YES;

}else{

[cell.btnDelete setHidden:YES];

[cell.imageDelete setHidden:YES];

[cell.btnMenu setHidden:NO];

//非编辑状态禁用手势

longPressGesture.enabled=NO;

}

[cell.btnMenu addTarget:self action:@selector(btnMenuAction:) forControlEvents:UIControlEventTouchDown];

cell.btnMenu.btnRow=indexPath.item;

[cell.btnDelete addTarget:self action:@selector(btnDeleteAction:) forControlEvents:UIControlEventTouchDown];

cell.btnDelete.btnRow=indexPath.item;

CCMoreListModel *model = [seas.dataList objectAtIndex:indexPath.item];

cell.headerModel=model;

return cell;

}

//2、添加长按手势处理方法

- (void)longPressAction:(UILongPressGestureRecognizer *)longPress {

//获取此次点击的坐标,根据坐标获取cell对应的indexPath

CGPoint point = [longPress locationInView:_collectionView];

NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:point];

//根据长按手势的状态进行处理。

switch (longPress.state) {

case UIGestureRecognizerStateBegan:

//当没有点击到cell的时候不进行处理

if (!indexPath) {

break;

}

//开始移动

[self.collectionView beginInteractiveMovementForItemAtIndexPath:indexPath];

break;

case UIGestureRecognizerStateChanged:

//移动过程中更新位置坐标

[self.collectionView updateInteractiveMovementTargetPosition:point];

break;

case UIGestureRecognizerStateEnded:

//停止移动调用此方法

[self.collectionView endInteractiveMovement];

break;

default:

//取消移动

[self.collectionView cancelInteractiveMovement];

break;

}

}

//3、监测可移动状态

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

//根据indexpath判断单元格是否可以移动,如果都可以移动,直接就返回YES ,不能移动的返回NO

return YES;

}

//4、通过系统的移动代理,交换拖动菜单项

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

toIndexPath:(NSIndexPath *)destinationIndexPath{

CCHighSeasPoolManager *seas=[CCHighSeasPoolManager sharedManager];

[seas.dataList exchangeObjectAtIndex:sourceIndexPath.row withObjectAtIndex:destinationIndexPath.row];

}

iOS长按手势列表拖拽功能实现的更多相关文章

  1. React Editor 应用编辑器(1) - 拖拽功能剖析

    这是可视化编辑器 Gaea-Editor 的第一篇连载分析文章,希望我能在有限的篇幅讲清楚制作这个网页编辑器的动机,以及可能带来的美好使用前景(画大饼).它会具有如下几个特征: 运行在网页 文档流布局 ...

  2. JQuery UI的拖拽功能

    JQuery UI是JQuery官方支持的WebUI 代码库,包含底层交互.动画.特效等API,并且封装了一些Web小部件(Widget).同时,JQuery UI继承了jquery的插件支持,有大量 ...

  3. vue下使用echarts折线图及其横坐标拖拽功能

    vue页面中使用折线图,并且有时间段筛选.因此就需要用到横坐标的拖拽功能. 界面效果如下: 现在来看这个效果的实现代码: drawLine() { let that = this, lineDate ...

  4. RCP:拖拽功能的实现 Drag and Drop

    SWT中的拖拽是使用的org.eclipse.swt.dnd. 有三个需要密切注意的类: 1.DragSource 2.DropTarget 3.Transfer DragSource封装了需要被拖拽 ...

  5. js实现登陆页面的拖拽功能

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>登 ...

  6. duilib中控件拖拽功能的实现方法(附源码)

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41144283 duilib库中原本没有显示的对控件增加拖拽的功能,而实际 ...

  7. ListView列表拖拽排序

    ListView列表拖拽排序能够參考Android源代码下的Music播放列表,他是能够拖拽的,源代码在[packages/apps/Music下的TouchInterceptor.java下]. 首 ...

  8. DIV 实现可拖拽 功能(留档)

    //可拖拽 功能 $.fn.extend({    //用法:$(element).jqDrag();    //element需要具备定位属性,需要手动调整层叠样式,这里只是修改鼠标拖动效果    ...

  9. 使用NGUI实现拖拽功能(拼图小游戏)

    上一次用UGUI实现了拼图小游戏,这次,我们来用NGUI来实现 实现原理 NGUI中提供了拖拽的基类UIDragDropItem,所以我们要做的就是在要拖拽的图片上加一个继承于该类的脚本,并实现其中的 ...

  10. 使用UGUI实现拖拽功能(拼图小游戏)

    实现方式 1.引入UGUI自带的事件系统 UnityEngine.EventSystems 2.为我们的类添加接口 IBeginDragHandler, IDragHandler, IEndDragH ...

随机推荐

  1. Android studio报错:Failed to allocate a 3213123 byte allocation with 31231 free bytes and 189MB ontil 0OM

    这个问题是运行内存超了 在AndroidManifest中加入 android:hardwareAccelerated="false"android:largeHeap= &quo ...

  2. 使用Git bash切换Gitee、GitHub多个Git账号

    使用Git bash切换Gitee.GitHub多个Git账号 ​ Git是分布式代码管理工具,使用命令行的方式提交commit.revert回滚代码.这里介绍使用Git bash软件来切换Gitee ...

  3. vue3 + ts 中出现 类型“typeof import(".........../node_modules/vue/dist/vue")”的参数不能赋给类型“Component<any, any, any, ComputedOptions, MethodOptions>”的参数。

    错误示例截图 解决方法 修改shims-vue.d.ts中的内容 declare module "*.vue" { import { defineComponent } from ...

  4. js map方法处理返回数据,获取指定数据简写方法

    map方法处理返回数据,获取指定数据简写方法 前言 后端返回数据为数组列表时,通常比较全面,包含了很多不需要的数据,可以通过 map 方法处理返回数据,筛选出想要的数据 例如 // 返回数据 res ...

  5. blender-十大基本操作

  6. 当 Spring 循环依赖碰上 Aysnc,调试过程中出现 BeanCurrentlyInCreationException,有点意思

    开心一刻 前两天有个女生加我,我同意了 第一天,她和我聊文学,聊理想,聊篮球,聊小猫小狗 第二天,她和我说要看我腹肌 吓我一跳,我反手就删除拉黑,我特喵一肚子的肥肉,哪来的腹肌! 循环依赖 关于 Sp ...

  7. 2023 ICPC 杭州游记

    题解 省流:三个 NOI 银牌合成一个 ICPC 区域赛银牌 感谢 gjy 的铜钱剑 和 hszx 的大家玩得很开心 两个联赛数据结构没做出来

  8. Linux驱动|rtc-hym8563移植笔记

    本文基于瑞芯微rk3568平台,关于该平台快速入手操作,大家可以参考以下文章: <瑞芯微rk356x板子快速上手> 0.什么是rtc-hym8563? RTC:实时时钟的缩写是(Real_ ...

  9. 如何arm入门

    因为有些需求[原因在文末],需要拍一张正装照. 我已经受够了那些小摄像馆拍的照片了, 完全拍不出我的神韵! 效果还不如我手机开个美颜! 生活问题,有时候问邻居效率很高! 在小区群里,问了一下邻居! 立 ...

  10. 金融、支付行业的开发者不得不知道的float、double计算误差问题

    为什么浮点数 float 或 double 运算的时候会有精度丢失的风险呢? <阿里巴巴 Java 开发手册>中提到:"浮点数之间的等值判断,基本数据类型不能用 == 来比较,包 ...