UICollectionView实现多九宫格拖拽

>  我这里要记录使用UICollectionView实现类似九宫格的拖拽的效果,类似iPhone桌面的SpringBoard,包括文件夹的合并

* SpringBoard:这是我第一次实现类似的效果,前期做了比较充分的调研工作。找了很多开源库进行研究,虽然有很多类似的实现,但是基本上都只局限于一个UICollectionView内不同的cell之间相互拖拽,跟我的目标还是有很多不同。其中两个库对我有重大借鉴意义。它们分别是LxGridViewi3-dragndrop



以下是SpringBoard的粗糙效果动画:

97652-aa3a6e6612817f43.gif
模拟iPhone 桌面效果

文件结构如下图:

97652-cb079819b59cb478.png
文件目录结构

源码地址https://github.com/TimBao/TBSpringBoard

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用HTML5中的draggable属性和JavaScript来实现九宫单元效果。以下是一个简单的实现: HTML: ``` <div class="grid"> <div class="cell" draggable="true"></div> <div class="cell" draggable="true"></div> <div class="cell" draggable="true"></div> <div class="cell" draggable="true"></div> <div class="cell" draggable="true"></div> <div class="cell" draggable="true"></div> <div class="cell" draggable="true"></div> <div class="cell" draggable="true"></div> <div class="cell" draggable="true"></div> </div> ``` CSS: ``` .grid { display: grid; grid-template-columns: repeat(3, 1fr); grid-gap: 10px; } .cell { width: 100%; height: 100%; background-color: #ddd; } ``` JavaScript: ``` var cells = document.querySelectorAll('.cell'); var draggingCell = null; for (var i = 0; i < cells.length; i++) { var cell = cells[i]; cell.addEventListener('dragstart', function() { draggingCell = this; setTimeout(function() { draggingCell.style.display = 'none'; }, 0); }); cell.addEventListener('dragend', function() { draggingCell.style.display = 'block'; draggingCell = null; }); cell.addEventListener('dragover', function(e) { e.preventDefault(); }); cell.addEventListener('dragenter', function(e) { e.preventDefault(); this.classList.add('hover'); }); cell.addEventListener('dragleave', function() { this.classList.remove('hover'); }); cell.addEventListener('drop', function() { if (this !== draggingCell) { var temp = this.innerHTML; this.innerHTML = draggingCell.innerHTML; draggingCell.innerHTML = temp; } this.classList.remove('hover'); }); } ``` 这段代码首先选择所有的单元,然后为每个单元添加事件监听器。当一个单元开始被时,我们把它的引用存储在draggingCell变量中,并且在0ms后将其隐藏。当单元结束时,我们恢复其显示状态并将draggingCell变量设置为null。 当一个单元到另一个单元上时,我们使用preventDefault()方法来防止默认的drop事件发生,并且给目标单元添加一个.hover类。当离开一个单元时,我们移除.hover类。当一个单元被放置时,我们检查是否目标单元不是当前的单元,如果不是,我们交换它们的innerHTML。 最后,我们使用CSS来布局九宫,并将每个单元设置为可的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值