版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在iOS中使用UICollectionView实现拖拽效果
本篇文章为大家展示了怎么在iOS中使用UICollectionView实现拖拽效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.创建工程项目和视图控制器,如下图2.声明对象和设置代理和数据源代理@interface
ViewController
()<UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>
@property
(nonatomic,
strong)
NSMutableArray
*dataArr;
@property
(nonatomic,
strong)
UICollectionView
*collectionView;
/**之前选中cell的NSIndexPath*/
@property
(nonatomic,
strong)
NSIndexPath
*oldIndexPath;
/**单元格的截图*/
@property
(nonatomic,
strong)
UIView
*snapshotView;
/**之前选中cell的NSIndexPath*/
@property
(nonatomic,
strong)
NSIndexPath
*moveIndexPath;
@end3.初始化UICollectionView,并添加长按手势,在viewDidLoad中初始化CGFloat
SCREEN_WIDTH
=
self.view.frame.size.width;
UICollectionViewFlowLayout
*flowLayout
=
[[UICollectionViewFlowLayout
alloc]
init];
flowLayout.itemSize
=
CGSizeMake((SCREEN_WIDTH-40.0)/3,
(SCREEN_WIDTH-40.0)/3);
UICollectionView
*collectionView
=
[[UICollectionView
alloc]
initWithFrame:CGRectMake(0,
50.0,
SCREEN_WIDTH,
(SCREEN_WIDTH-40.0)/3+20.0)
collectionViewLayout:flowLayout];
collectionView.dataSource
=
self;
collectionView.delegate
=
self;
collectionView.backgroundColor
=
[UIColor
whiteColor];
[collectionView
registerClass:[UICollectionViewCell
class]
forCellWithReuseIdentifier:@"uicollectionviewcell"];
[self.view
addSubview:self.collectionView
=
collectionView];
//
添加长按手势
UILongPressGestureRecognizer
*longPress
=
[[UILongPressGestureRecognizer
alloc]
initWithTarget:self
action:@selector(handlelongGesture:)];
[collectionView
addGestureRecognizer:longPress];4.实例化数据源,(50个随机颜色,透明度0.8),在viewDidLoad中初始化self.dataArr
=
[[NSMutableArray
alloc]
init];
for
(NSInteger
index
=
0;
index
<
50;
index
++)
{
CGFloat
hue
=
(arc4random()%256/256.0);
//0.0
到
1.0
CGFloat
saturation
=
(arc4random()%128/256.0)+0.5;
//0.5
到
1.0
CGFloat
brightness
=
(arc4random()%128/256.0)+0.5;
//0.5
到
1.0
UIColor
*color
=
[UIColor
colorWithHue:hue
saturation:saturation
brightness:brightness
alpha:0.5];
[self.dataArr
addObject:color];
}5.实现UICollectionView的UICollectionViewDataSource的两个必须实现的方法#pragma
mark
-
UICollectionViewDataSource
-
(NSInteger)collectionView:(UICollectionView
*)collectionView
numberOfItemsInSection:(NSInteger)section
{
return
self.dataArr.count;
}
-
(UICollectionViewCell
*)collectionView:(UICollectionView
*)collectionView
cellForItemAtIndexPath:(NSIndexPath
*)indexPath
{
UICollectionViewCell
*cell
=
[collectionView
dequeueReusableCellWithReuseIdentifier:@"uicollectionviewcell"
forIndexPath:indexPath];
cell.backgroundColor
=
self.dataArr[indexPath.row];
return
cell;
}6.重点来了,实现长按手势方法#pragma
mark
-
长按手势
-
(void)handlelongGesture:(UILongPressGestureRecognizer
*)longPress
{
if
([[[UIDevice
currentDevice]
systemVersion]
floatValue]
<
9.0)
{
[self
action:longPress];
}
else
{
[self
iOS9_Action:longPress];
}
}7.iOS9之后的实现#pragma
mark
-
iOS9
之后的方法
-
(BOOL)collectionView:(UICollectionView
*)collectionView
canMoveItemAtIndexPath:(NSIndexPath
*)indexPath
{
//
返回YES允许row移动
return
YES;
}
-
(void)collectionView:(UICollectionView
*)collectionView
moveItemAtIndexPath:(NSIndexPath
*)sourceIndexPath
toIndexPath:(NSIndexPath
*)destinationIndexPath
{
//取出移动row数据
id
color
=
self.dataArr[sourceIndexPath.row];
//从数据源中移除该数据
[self.dataArr
removeObject:color];
//将数据插入到数据源中的目标位置
[self.dataArr
insertObject:color
atIndex:destinationIndexPath.row];
}
-
(void)iOS9_Action:(UILongPressGestureRecognizer
*)longPress
{
switch
(longPress.state)
{
case
UIGestureRecognizerStateBegan:
{
//手势开始
//判断手势落点位置是否在row上
NSIndexPath
*indexPath
=
[self.collectionView
indexPathForItemAtPoint:[longPress
locationInView:self.collectionView]];
if
(indexPath
==
nil)
{
break;
}
UICollectionViewCell
*cell
=
[self.collectionView
cellForItemAtIndexPath:indexPath];
[self.view
bringSubviewToFront:cell];
//iOS9方法
移动cell
[self.collectionView
beginInteractiveMovementForItemAtIndexPath:indexPath];
}
break;
case
UIGestureRecognizerStateChanged:
{
//
手势改变
//
iOS9方法
移动过程中随时更新cell位置
[self.collectionView
updateInteractiveMovementTargetPosition:[longPress
locationInView:self.collectionView]];
}
break;
case
UIGestureRecognizerStateEnded:
{
//
手势结束
//
iOS9方法
移动结束后关闭cell移动
[self.collectionView
endInteractiveMovement];
}
break;
default:
//手势其他状态
[self.collectionView
cancelInteractiveMovement];
break;
}
}8.iOS9之前的实现#pragma
mark
-
iOS9
之前的方法
-
(void)action:(UILongPressGestureRecognizer
*)longPress
{
switch
(longPress.state)
{
case
UIGestureRecognizerStateBegan:
{
//
手势开始
//判断手势落点位置是否在row上
NSIndexPath
*indexPath
=
[self.collectionView
indexPathForItemAtPoint:[longPress
locationInView:self.collectionView]];
self.oldIndexPath
=
indexPath;
if
(indexPath
==
nil)
{
break;
}
UICollectionViewCell
*cell
=
[self.collectionView
cellForItemAtIndexPath:indexPath];
//
使用系统的截图功能,得到cell的截图视图
UIView
*snapshotView
=
[cell
snapshotViewAfterScreenUpdates:NO];
snapshotView.frame
=
cell.frame;
[self.view
addSubview:self.snapshotView
=
snapshotView];
//
截图后隐藏当前cell
cell.hidden
=
YES;
CGPoint
currentPoint
=
[longPress
locationInView:self.collectionView];
[UIView
animateWithDuration:0.25
animations:^{
snapshotView.transform
=
CGAffineTransformMakeScale(1.05,
1.05);
snapshotView.center
=
currentPoint;
}];
}
break;
case
UIGestureRecognizerStateChanged:
{
//
手势改变
//当前手指位置
截图视图位置随着手指移动而移动
CGPoint
currentPoint
=
[longPress
locationInView:self.collectionView];
self.snapshotView.center
=
currentPoint;
//
计算截图视图和哪个可见cell相交
for
(UICollectionViewCell
*cell
in
self.collectionView.visibleCells)
{
//
当前隐藏的cell就不需要交换了,直接continue
if
([self.collectionView
indexPathForCell:cell]
==
self.oldIndexPath)
{
continue;
}
//
计算中心距
CGFloat
space
=
sqrtf(pow(self.snapshotView.center.x
-
cell.center.x,
2)
+
powf(self.snapshotView.center.y
-
cell.center.y,
2));
//
如果相交一半就移动
if
(space
<=
self.snapshotView.bounds.size.width
/
2)
{
self.moveIndexPath
=
[self.collectionView
indexPathForCell:cell];
//移动
会调用willMoveToIndexPath方法更新数据源
[self.collectionView
moveItemAtIndexPath:self.oldIndexPath
toIndexPath:self.moveIndexPath];
//设置移动后的起始indexPath
self.oldIndexPath
=
self.moveIndexPath;
break;
}
}
}
break;
default:
{
//
手势结束和其他状态
UICollectionViewCell
*cell
=
[self.collectionView
cellForItemAtIndexPath:self.oldIndexPath];
//
结束动画过程中停止交互,防止出问题
self.collectionView.userInteractionEnabled
=
NO;
//
给截图视图一个动画移动到隐藏cell的新位置
[UIView
animateWithDuration:0.25
animations:^{
self.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大厦工程合同清单
- 2024年事业单位招聘考试安徽省马鞍山市职业能力倾向测验题库含答案解析
- 2024年事业单位招聘考试辽宁省大连市职业能力倾向测验题库含答案解析
- 2024年事业单位招聘考试新疆塔城地区职业能力倾向测验题库含答案解析【易错题和难点汇编】
- 2023年婚姻登记处工作总结报告
- 2023年化验室年总结报告
- 光致抗蚀剂行业相关投资计划提议
- 【语文】《自然选择的证明》《宇宙的边疆》联读课件 2023-2024学年统编版高中语文选择性必修下册
- 血液制剂项目商业计划书及实施方案|瑞克咨询|2024年编|
- 汽车安全气囊及装置项目市场研究报告及运营管理方案|瑞克咨询|2024年编制|
- 2022侵袭性真菌病实验室诊断方法临床应用专家共识
- 苏州市苏州实验中学2024届高三最后一模英语试题含解析
- 《汽车冬季保养》课件
- 教材使用情况汇报
- 绿色建材招商引资方案
- 云服务合同终止协议模板
- 无人机的制造工艺课件
- 渔业安全生产培训课件
- 有机肥采购及运输方案
- 教育统计学03讲 集中量数
- 小学数学综合实践活动讲座-副本课件
评论
0/150
提交评论