swift 选中长按项_Swift下使用UICollectionView 实现长按拖拽功能

导读

简单用Swift写了一个collectionview的拖拽点击排序效果;

拖拽排序是新闻类的App可以说是必有的交互设计,如今日头条,网易新闻等。

GitHub地址:https://github.com/wangliujiayou/Swift-dragLabel 欢迎Star.

效果

主要代码

手势长按移动

1.给CollectionViewCell添加一个长按手势.

private lazy var collectionView: UICollectionView = {

let clv = UICollectionView(frame: self.view.frame, collectionViewLayout: ChannelViewLayout())

clv.backgroundColor = UIColor.white

clv.delegate = self

clv.dataSource = self

clv.register(ChannelViewCell.self, forCellWithReuseIdentifier: ChannelViewCellIdentifier)

clv.register(ChannelHeaderView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: ChannelViewHeaderIdentifier)

let longPress = UILongPressGestureRecognizer(target: self, action: #selector(longPressGesture(_:)))

clv.addGestureRecognizer(longPress)

return clv

}()

2.开始长按时对cell进行截图或拷贝一个cell,并隐藏cell.

//MARK: - 长按开始

private func dragBegan(point: CGPoint) {

indexPath = collectionView.indexPathForItem(at: point)

if indexPath == nil || (indexPath?.section)! > 0 || indexPath?.item == 0

{return}

let item = collectionView.cellForItem(at: indexPath!) as? ChannelViewCell

item?.isHidden = true

dragingItem.isHidden = false

dragingItem.frame = (item?.frame)!

dragingItem.text = item!.text

//放大效果(此处可以根据需求随意修改)

dragingItem.transform = CGAffineTransform(scaleX: 1.1, y: 1.1)

}

3.在手势移动的时候,找到目标是的indexPatch,再调用系统的api交换这个cell和隐藏cell的位置,并且更新数据.

//MARK: - 移动过程

private func drageChanged(point: CGPoint) {

if indexPath == nil || (indexPath?.section)! > 0 || indexPath?.item == 0 {return}

dragingItem.center = point

targetIndexPath = collectionView.indexPathForItem(at: point)

if targetIndexPath == nil || (targetIndexPath?.section)! > 0 || indexPath == targetIndexPath || targetIndexPath?.item == 0 {return}

// 更新数据

let obj = selectedArr[indexPath!.item]

selectedArr.remove(at: indexPath!.row)

selectedArr.insert(obj, at: targetIndexPath!.item)

//交换位置

collectionView.moveItem(at: indexPath!, to: targetIndexPath!)

//进行记录

indexPath = targetIndexPath

}

4.手势停止或取消时,移除view,显示隐藏cell. (这里手势取消也要掉用此方法)

//MARK: - 长按结束或取消

private func drageEnded(point: CGPoint) {

if indexPath == nil || (indexPath?.section)! > 0 || indexPath?.item == 0 {return}

let endCell = collectionView.cellForItem(at: indexPath!)

UIView.animate(withDuration: 0.25, animations: {

self.dragingItem.transform = CGAffineTransform.identity

self.dragingItem.center = (endCell?.center)!

}, completion: {

(finish) -> () in

endCell?.isHidden = false

self.dragingItem.isHidden = true

self.indexPath = nil

})

}

点击移动

collectionView的点击方法,我这里分为两段,第一段为点击处理事件,第二段为点击添加添加标签(编辑状态下第一段可以点击排序)

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

if indexPath.section > 0 {

// 更新数据

let obj = recommendArr[indexPath.item]

recommendArr.remove(at: indexPath.item)

selectedArr.append(obj)

//移动方法

collectionView.moveItem(at: indexPath, to: NSIndexPath(item: selectedArr.count - 1, section: 0) as IndexPath)

} else {

if isEdite {

if indexPath.item == 0 {return}

// 更新数据

let obj = selectedArr[indexPath.item]

selectedArr.remove(at: indexPath.item)

recommendArr.insert(obj, at: 0)

//移动方法

collectionView.moveItem(at: indexPath, to: NSIndexPath(item: 0, section: 1) as IndexPath)

} else {

if switchoverCallback != nil {

//处理点击的闭包

switchoverCallback!(selectedArr, recommendArr, indexPath.item)

_ = navigationController?.popViewController(animated: true)

}

}

}

}

其他

此代码只是一个效果,没有怎么封装,如果仔细看过的朋友可以知道其实没有多么复杂

点击移动

collectionView.moveItem(at: indexPath, to: NSIndexPath(item: 0, section: 1) as IndexPath)

拖拽移动

collectionView.moveItem(at: indexPath!, to: targetIndexPath!)

主要就是这两个方法,其他都是处理逻辑以及视图效果.

提示

如果你们是从iOS9开始适配的话,那么可以用系统的Api,非常简单好用,大家这里可以自己去试试.

// Support for reordering

@available(iOS 9.0, *)

open func beginInteractiveMovementForItem(at indexPath: IndexPath) -> Bool // returns NO if reordering was prevented from beginning - otherwise YES

@available(iOS 9.0, *)

open func updateInteractiveMovementTargetPosition(_ targetPosition: CGPoint)

@available(iOS 9.0, *)

open func endInteractiveMovement()

@available(iOS 9.0, *)

open func cancelInteractiveMovement()

源码可以从这里下载

以上所述是小编给大家介绍的Swift下使用UICollectionView 实现长按拖拽功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

本文标题: Swift下使用UICollectionView 实现长按拖拽功能

本文地址: http://www.cppcns.com/ruanjian/swift/182182.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA实现类自动输出需要实现的方法

在IDEA中写实现类时可以自动输出需要实现的方法,具体见下 首先定义一个实现Runnable接口的类 发现报错了,接着把鼠标放置报错的地方,按下altenter,选择下面红框 此时就会出现需要我们实现的接口中方法,点击ok

字典的数据怎么转变为excel_Excel小技巧——快速为多行数据排列名次

大家好,上一期我们介绍了合并单元格的自动排序小技巧,今天,再为大家准备一个排名表,下面我们就利用这个表格,来了解一下快速排名的方法吧。首先,我们在第一行排名单元格中输入今天要学习的公式前半部分。公…

GIt 从入门到放弃

一、注册github账号 github网址https://github.com/ 下一步 然后,你的邮箱会收到一封邮件,进行邮箱验证就行了 二、创建github仓库 登录你的github,在首页的右方可以看到下图所示(我已经创建过项目了,没有创建过项目的…

麻省理工牛人解说数学体系

来源:P.Linux‘s blog与 ima一、为什么要深入数学的世界作为计算机的学生,我没有任何企图要成为一个数学家。我学习数学的目的,是要想爬上巨人的肩膀,希望站在更高的高度,能把我自己研究的东西看得更深广一些。说起来&…

programing python_Programing in Python3(Second Edition)_实例

Programming in Python3 (Second Edition)实例前言:在学习Python的过程中推荐一本书,《Programming in Python3 》也就是我以前用过的。推荐理由是这本书讲的很全面很详细,有一些非常实用的实例可以提供给读者学习,学完以后不仅知…

IDEA提示方法参数的快捷键

在写Java方法的时候有时想让软件提示一下方法的参数,解决方法是将鼠标放置到方法括号里,按下ctrlp,即可显示方法参数

docker常用命令_docker常用命令整理

docker常用命令整理代码狂魔 • 5 天前 • 技术积累 • 14 • 0前面已经把docker是什么和 docker怎么安装已经写了,现在我将常用命令做一个整理,方便日后查阅常用命令docker pull ${CONTAINER NAME} #拉取镜像 docker images …

cuda矩阵相乘_cuda初学(1):稀疏矩阵向量乘法(单精度)

初步学习CUDA编程,实现简单稀疏矩阵向量乘法运算,由于硬件限制,目前只测试了单精度程序GPU计算子程序gpu_fmmv.cu:#include #include // CUDA-C includes#include#ifdef __cplusplusextern "C" {#endif// For Fortran…

素数问题是物质的几何学问题

来源:知乎大家知道,黎曼猜想、孪生素数猜想、哥德巴赫猜想中皆涉及素数(质数)。关于黎曼猜想,黄逸文说“这是1900年希尔伯特提出的23个唯一未被解决的问题,也是数学中最重大的未解决的难题。1859年&#xf…

IEEE期刊LaTeX模板

https://template-selector.ieee.org/secure/templateSelector/publicationType

shell sort 最后一列排序_没想到 Shell 命令竟然还能这么玩?| Shell 玩转大数据分析...

关于作者:程序猿石头(ID: tangleithu),现任阿里巴巴技术专家,清华学渣,前大疆后端 Leader。正文开始本文是一个命令行工具的综合应用,将用一个具体的例子来阐述如何用 Shell 来进行高效地数据统计和分析。最近北京又开…

对于不是特别擅长Photoshop的人来说,熟悉和运用Photoshop工具提供的各类便捷的快捷键,是有帮助的。...

应用程序菜单快捷键之文件 应用程序菜单快捷键之编辑 应用程序菜单快捷键之图像图层 应用程序菜单快捷键 应用程序菜单快捷键之视图 Ctrl H 取消参考线调板菜单快捷键一览。 工具板快捷键一览 其他类别的快捷键。 按Shift时可画出正圆和方形的选区、图形、直线。 按Shift时可…

ireport参数传递json_Json传递数据两种方式(json大全)

1.Json传递数据两种方式(json大全)----------------------------字符串var list1 ["number","name"];var param{};param["list1"] list1;param["test"] "java";var jsonJSON.stringify(param);$.ajax({type:POST,url: CTX …

懂数学人的都认同:数学的本质[关联]万物(二)

来源:数学职业家结构、关系与信息关系是与结构绑定的不可分割的,是对结构从某个视角观察的结果,并且这个角度看到的是可以被观察者所理解和可感知的。这里的可感知,即是可以被人体的感觉系统(如视觉、听觉、触觉等&…

java比较StringBuilder和StringBuffer字符串内容是否相等

由于StringBuilder和StringBuffer没有重写equals方法,所以还是使用的Object的equals方法。对比的是两个对象的地址是否相等。为了比较StringBuilder和StringBuffer字符串内容是否相等,需要先将其转换为string,String 由于重写了equals方法&am…

计算虚拟化涉及的关键技术有哪几项_都开始商用了 5G的这些关键技术还不知道?...

[PConline 杂谈]作为新一代移动通信技术,5G为我们带来了更高的数据速率与更低的延迟,甚至比4G快了100倍。在满足移动超高清视频、AR/VR等大流量应用的同时,更将开启万物互联、深度融合的发展新阶段。如果说3G提升了速度,4G改变了生…

有效沟通

先看两个笑话: 一个苏格兰人去伦敦,想顺便探望一位老朋友,但却忘了他的住址,于是给家父发了一份电报:“您知道托马的住址吗?速告!”当天,他就收到一份加急回电:“知道。”…

)类 新建javafx程序时_第三章 第一个OpenCV的JavaFX应用程序.md

# 第三章 第一个OpenCV的JavaFX应用程序---***注意***:我们假设您现在已经阅读了之前的教程。如果没有,请在[http://opencv-java-tutorials.readthedocs.org/en/latest/index.html](http://opencv-java-tutorials.readthedocs.org/en/latest/index.html)…

公式和图片转LaTeX网址

在线LaTeX公式编辑器-编辑器

沃丰报告:物联网的未来

物联网的未来激动人心,但物联网并不只为那些极具创新精神的创业企业而生。大多数物联网项目都不是为了创造头条新闻,而是为了做出切实的成果。我相信我们已经越过了临界点,物联网已经成为主流。来源 | 沃达丰物联网近日,沃达丰(vo…