请选择 进入手机版 | 继续访问电脑版

iOS_UI进阶【拖拽排序】的实现

发表于 2016-11-28 19:00 显示全部楼层 21 1314

原文出处: HelloYeah

导读

拖拽排序是新闻类的App可以说是必有的交互设计,如今日头条,网易新闻等。拖拽排序是一个交互体验非常好的设计,简单,方便。

今日头条的拖拽排序界面

我实现的长按拖拽排序效果

实现方案

1.给CollectionViewCell添加一个长按手势,通过协议把手势传递到collectionView所在的控制器中。

- (void)awakeFromNib{    self.layer.cornerRadius = 3;    self.layer.masksToBounds = YES;    //给每个cell添加一个长按手势
    UILongPressGestureRecognizer * longPress =[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress:)];
    longPress.delegate = self;
    [self addGestureRecognizer:longPress];
}

- (void)longPress:(UILongPressGestureRecognizer *)longPress{    if (self.delegate && [self.delegate respondsToSelector:@selector(longPress:)]) {
        [self.delegate longPress:longPress];
    }
}


2.开始长按时对cell进行截图,并隐藏cell。

- (void)longPress:(UILongPressGestureRecognizer *)longPress{    //记录上一次手势的位置
    static CGPoint startPoint;    //触发长按手势的cell
    MovingCell * cell = (MovingCell *)longPress.view;    //开始长按
    if (longPress.state == UIGestureRecognizerStateBegan) {
        [self shakeAllCell];        //获取cell的截图
        _snapshotView  = [cell snapshotViewAfterScreenUpdates:YES];
        _snapshotView.center = cell.center;
        [_collectionView addSubview:_snapshotView];
        _indexPath= [_collectionView indexPathForCell:cell];
        _originalCell = cell;
        _originalCell.hidden = YES;
        startPoint = [longPress locationInView:_collectionView];
    }


3、在手势移动的时候,移动截图视图,用遍历的方法求出截图移动到哪个cell的位置,再调用系统的api交换这个cell和隐藏cell的位置,并且数据源中的数据也需要调整顺序

    //手势移动的时候
    else if (longPress.state == UIGestureRecognizerStateChanged){
    CGFloat tranX = [longPress locationOfTouch:0 inView:_collectionView].x - startPoint.x;
    CGFloat tranY = [longPress locationOfTouch:0 inView:_collectionView].y - startPoint.y;    //设置截图视图位置
    _snapshotView.center = CGPointApplyAffineTransform(_snapshotView.center, CGAffineTransformMakeTranslation(tranX, tranY));
    startPoint = [longPress locationOfTouch:0 inView:_collectionView];    //计算截图视图和哪个cell相交
    for (UICollectionViewCell *cell in [_collectionView visibleCells]) {        //跳过隐藏的cell
        if ([_collectionView indexPathForCell:cell] == _indexPath) {            continue;
        }        //计算中心距
        CGFloat space = sqrtf(pow(_snapshotView.center.x - cell.center.x, 2) + powf(_snapshotView.center.y - cell.center.y, 2));        //如果相交一半且两个视图Y的绝对值小于高度的一半就移动
        if (space <= _snapshotView.bounds.size.width * 0.5 && (fabs(_snapshotView.center.y - cell.center.y) <= _snapshotView.bounds.size.height * 0.5)) {
            _nextIndexPath = [_collectionView indexPathForCell:cell];            if (_nextIndexPath.item > _indexPath.item) {                for (NSUInteger i = _indexPath.item; i < _nextIndexPath.item ; i ++) {
                    [self.array exchangeObjectAtIndex:i withObjectAtIndex:i + 1];
                }
            }else{                for (NSUInteger i = _indexPath.item; i > _nextIndexPath.item ; i --) {
                    [self.array exchangeObjectAtIndex:i withObjectAtIndex:i - 1];
                }
            }            //移动
            [_collectionView moveItemAtIndexPath:_indexPath toIndexPath:_nextIndexPath];            //设置移动后的起始indexPath
            _indexPath = _nextIndexPath;            break;
        }
    }


4.手势停止时,移除截图的view,显示隐藏cell

//手势停止时}else if(longPress.state == UIGestureRecognizerStateEnded){
    [self stopShake];
    [_snapshotView removeFromSuperview];
    _originalCell.hidden = NO;
}


其他

代码还可以进一步封装,写一个数据管理类dataTool,dataTool作为collectionView的数据源,所有的数据源方法都写到dataTool类中。手势的代理方法也在里面实现,这样控制器会简洁很多,控制器就不需要关注拖拽排序的具体逻辑了。大家有空可以自己写写看,也许你们有更好的处理方案,可以评论交流一下。
github地址:
https://github.com/HelloYeah/DraggingSort

提示

如果你们是从iOS9开始适配的话,那么可以用系统的Api,非常简单好用

//是否允许拖拽
 - (BOOL)collectionView:(UICollectionView *)collectionView canMoveItemAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(9_0); /**
  *   从sourceIndexPath 拖拽至destinationIndexPath,在这个代理方法里修改数据源即可。
  *   exchangeObjectAtIndex:sourceIndexPath.item withObjectAtIndex: destinationIndexPath.item
  */
 - (void)collectionView:(UICollectionView *)collectionView moveItemAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath*)destinationIndexPath NS_AVAILABLE_IOS(9_0);




回复 使用道具
举报
uesik08

发表于 11-24 21:27 显示全部楼层

不限流量不限网速,山区、农村、城镇高速免费上网不花钱!最新9500WG接收信号高达19公里,无论您身在地球任何一个角落,都能搜到信号实现免费上网,最新软件全自动智能管理,信号强,网速快,优先自动连接上网,免去您任何手动繁琐作,保证让您高速上网免费不花钱就是这么简单! 朋友们,您还在为家里装修要拉网线烦恼吗?还在忧愁每年交昂贵网费吗?还在苦恼出差无法上网吗?还在傻傻节省4G流量每月还要高达几十元流量费吗?还在敢怒不敢言的公司、学校、宿舍限制上网吗?还在苦逼每天站在阳台高举手机为了搜一个wifi吗?世界上最遥远的距离是明明有wifi,却用不了是多么痛苦的事!玩一会王者荣耀没了几个G的流量,看了一会视频,没了几个G的流量,壕!?还是无奈!?明明很节省,没用少则几十元多则上百元的流量费,如此高昂的费用是不是让您皱眉呢?没关系,用最新9500WG永久免费上网吧!只要238元让您永久免费上网不花钱,无需电脑,无需布线,只需插电,电脑、手机、平板免费上网就是这么任性,wifi信号覆盖高达19公里,无需站阳台,无需放窗外,想在哪里就在哪里!信号强,网速快,免费上网,能免则免,免费到底! 免费热线:188-2652-1502 客服QQ:1094201567 官网 www.ccyxf.com 9500WG
回复 支持 反对 使用道具
举报
竑脞贡

发表于 11-24 21:08 显示全部楼层

不限流量不限网速,山区、农村、城镇高速免费上网不花钱!最新9500WG接收信号高达19公里,无论您身在地球任何一个角落,都能搜到信号实现免费上网,最新软件全自动智能管理,信号强,网速快,优先自动连接上网,免去您任何手动繁琐作,保证让您高速上网免费不花钱就是这么简单! 朋友们,您还在为家里装修要拉网线烦恼吗?还在忧愁每年交昂贵网费吗?还在苦恼出差无法上网吗?还在傻傻节省4G流量每月还要高达几十元流量费吗?还在敢怒不敢言的公司、学校、宿舍限制上网吗?还在苦逼每天站在阳台高举手机为了搜一个wifi吗?世界上最遥远的距离是明明有wifi,却用不了是多么痛苦的事!玩一会王者荣耀没了几个G的流量,看了一会视频,没了几个G的流量,壕!?还是无奈!?明明很节省,没用少则几十元多则上百元的流量费,如此高昂的费用是不是让您皱眉呢?没关系,用最新9500WG永久免费上网吧!只要238元让您永久免费上网不花钱,无需电脑,无需布线,只需插电,电脑、手机、平板免费上网就是这么任性,wifi信号覆盖高达19公里,无需站阳台,无需放窗外,想在哪里就在哪里!信号强,网速快,免费上网,能免则免,免费到底! 免费热线:188-2652-1502 客服QQ:1094201567 官网 www.ccyxf.com 9500WG
回复 支持 反对 使用道具
举报
rdgyz28

发表于 11-23 01:10 显示全部楼层

KA72体积全球最小智能监控摄像机,小巧机身和1圆硬币差不多,麻雀虽小五脏俱全,KA72主控芯片采用美国进口安霸芯片,有史以来,最强大,最智能的芯片,保证连续录像录音不发热不死机,1600万像素单反级别完全媲美iPhone8摄像头,8核芯让运行更流畅更稳定,摄像镜头采用进口OV9715图像感光蓝镜芯片,170度宽广角上下左右全覆盖,KA72更是不惜成本打造全新技术HDR+WDR软硬合一,不论是在强光、弱光、晴天、雨天、阴天等不同环境都能自动校检所摄取画面清晰可见。强劲的18颗进口纳米夜视灯不爆红不发红,保证在漆黑一片无任何光线可视范围高达100米!录像录音不闪灯不亮灯、晚上夜视不发红,更隐蔽更神奇,防偷防婚外最佳设备!强磁机身随意吸贴,无需任何安装,更隐蔽更便捷的智能监控让您随心所欲! 选择KA72的理由:可吸附在衣服、包包、椅子、床下、衣柜、窗帘、洗手间、电视、门框、天花板、电灯、汽车等等,安装位置只有您想不到,没有KA72做不到。内置大容量电池,充满可用72小时,可连接充电宝、电源边充电录;KA72更是内置特有Turbo一键穿墙WIFI模块,WIFI发射更远更强更稳定,无需网络、无需网线、无需流量、无需布线,苹果手机、安卓手机、手机无需联网想看就看,智能监控就该这么简单,您想要的画面它都有! 在花样年华的世界上,你对她的信任不一定能换来她的真诚,爱人出轨、女友背叛、保姆虐童、员工偷懒、仓库失窃、店铺被抢、入室偷盗...还原真相,KA72您值得拥有!出差在外,家里发生了什么,您想要的画面,手机想看就看!远程监控不受距离限制,例如KA72在中国,人在美国,拿出手机就可以实时看、回放、下载、删除,隐私的画面,想下载就下载,想删就删,监控就该这样智能。 KA72参数:1600万像素、170度大广角、18颗进口夜视不发红光、HDR+WDR+WiFi功能、8核心处理器、全新HEVC编码技术。我们追求高质量,我们不打价格战,我们只拼高品质! QQ:851138899 热线:13530047234 官网:www.25xc.net KA72官网
回复 支持 反对 使用道具
举报
百变小辉辉

发表于 02-08 16:28 显示全部楼层

回复 支持 反对 使用道具
举报
易文沁

发表于 02-08 15:29 显示全部楼层

祝愿小码哥越来越红火!!红红火火恍恍惚惚!

回复 支持 反对 使用道具
举报
TigerCY

发表于 02-08 12:39 显示全部楼层

楼主你好

回复 支持 反对 使用道具
举报
活泼的方小闹

发表于 02-08 12:22 显示全部楼层

跟你讲个故事:六一那天我玩lol,我进游戏就打了一句61快乐,有3个人说了谢谢,我赶紧退出,我果断退出游戏。

回复 支持 反对 使用道具
举报
今夜来微微

发表于 02-08 09:34 显示全部楼层

祝愿小码哥越来越红火!!红红火火恍恍惚惚!

回复 支持 反对 使用道具
举报
xmf

发表于 02-08 07:26 显示全部楼层

作为新人,在吧里不敢大声说话,也不敢得罪人,只能默默地顶完贴转身就走,不求深藏功与名,只求前排混脸熟

回复 支持 反对 使用道具
举报
123下一页

发表新文章
小码哥官方团队

小码哥教育

0

学分

1846

学币

3770

积分

小码哥教育

Rank: 5Rank: 5

积分
3770

小码哥一周年勋章活动达人勋章小码哥社区荣誉创始人勋章小码哥版主勋章真人认证勋章前100注册用户勋章社区第一人勋章意见领袖勋章真土豪勋章勋章

Ta的主页 发消息
精华帖排行榜

精彩推荐

  • 关注小码哥教育