




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】怎么在iOS中使用UICollectionView實(shí)現(xiàn)拖拽效果
本篇文章為大家展示了怎么在iOS中使用UICollectionView實(shí)現(xiàn)拖拽效果,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。1.創(chuàng)建工程項(xiàng)目和視圖控制器,如下圖2.聲明對(duì)象和設(shè)置代理和數(shù)據(jù)源代理@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,并添加長(zhǎng)按手勢(shì),在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];
//
添加長(zhǎng)按手勢(shì)
UILongPressGestureRecognizer
*longPress
=
[[UILongPressGestureRecognizer
alloc]
initWithTarget:self
action:@selector(handlelongGesture:)];
[collectionView
addGestureRecognizer:longPress];4.實(shí)例化數(shù)據(jù)源,(50個(gè)隨機(jī)顏色,透明度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.實(shí)現(xiàn)UICollectionView的UICollectionViewDataSource的兩個(gè)必須實(shí)現(xiàn)的方法#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.重點(diǎn)來(lái)了,實(shí)現(xiàn)長(zhǎng)按手勢(shì)方法#pragma
mark
-
長(zhǎng)按手勢(shì)
-
(void)handlelongGesture:(UILongPressGestureRecognizer
*)longPress
{
if
([[[UIDevice
currentDevice]
systemVersion]
floatValue]
<
9.0)
{
[self
action:longPress];
}
else
{
[self
iOS9_Action:longPress];
}
}7.iOS9之后的實(shí)現(xiàn)#pragma
mark
-
iOS9
之后的方法
-
(BOOL)collectionView:(UICollectionView
*)collectionView
canMoveItemAtIndexPath:(NSIndexPath
*)indexPath
{
//
返回YES允許row移動(dòng)
return
YES;
}
-
(void)collectionView:(UICollectionView
*)collectionView
moveItemAtIndexPath:(NSIndexPath
*)sourceIndexPath
toIndexPath:(NSIndexPath
*)destinationIndexPath
{
//取出移動(dòng)row數(shù)據(jù)
id
color
=
self.dataArr[sourceIndexPath.row];
//從數(shù)據(jù)源中移除該數(shù)據(jù)
[self.dataArr
removeObject:color];
//將數(shù)據(jù)插入到數(shù)據(jù)源中的目標(biāo)位置
[self.dataArr
insertObject:color
atIndex:destinationIndexPath.row];
}
-
(void)iOS9_Action:(UILongPressGestureRecognizer
*)longPress
{
switch
(longPress.state)
{
case
UIGestureRecognizerStateBegan:
{
//手勢(shì)開始
//判斷手勢(shì)落點(diǎn)位置是否在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方法
移動(dòng)cell
[self.collectionView
beginInteractiveMovementForItemAtIndexPath:indexPath];
}
break;
case
UIGestureRecognizerStateChanged:
{
//
手勢(shì)改變
//
iOS9方法
移動(dòng)過(guò)程中隨時(shí)更新cell位置
[self.collectionView
updateInteractiveMovementTargetPosition:[longPress
locationInView:self.collectionView]];
}
break;
case
UIGestureRecognizerStateEnded:
{
//
手勢(shì)結(jié)束
//
iOS9方法
移動(dòng)結(jié)束后關(guān)閉cell移動(dòng)
[self.collectionView
endInteractiveMovement];
}
break;
default:
//手勢(shì)其他狀態(tài)
[self.collectionView
cancelInteractiveMovement];
break;
}
}8.iOS9之前的實(shí)現(xiàn)#pragma
mark
-
iOS9
之前的方法
-
(void)action:(UILongPressGestureRecognizer
*)longPress
{
switch
(longPress.state)
{
case
UIGestureRecognizerStateBegan:
{
//
手勢(shì)開始
//判斷手勢(shì)落點(diǎn)位置是否在row上
NSIndexPath
*indexPath
=
[self.collectionView
indexPathForItemAtPoint:[longPress
locationInView:self.collectionView]];
self.oldIndexPath
=
indexPath;
if
(indexPath
==
nil)
{
break;
}
UICollectionViewCell
*cell
=
[self.collectionView
cellForItemAtIndexPath:indexPath];
//
使用系統(tǒng)的截圖功能,得到cell的截圖視圖
UIView
*snapshotView
=
[cell
snapshotViewAfterScreenUpdates:NO];
snapshotView.frame
=
cell.frame;
[self.view
addSubview:self.snapshotView
=
snapshotView];
//
截圖后隱藏當(dāng)前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:
{
//
手勢(shì)改變
//當(dāng)前手指位置
截圖視圖位置隨著手指移動(dòng)而移動(dòng)
CGPoint
currentPoint
=
[longPress
locationInView:self.collectionView];
self.snapshotView.center
=
currentPoint;
//
計(jì)算截圖視圖和哪個(gè)可見(jiàn)cell相交
for
(UICollectionViewCell
*cell
in
self.collectionView.visibleCells)
{
//
當(dāng)前隱藏的cell就不需要交換了,直接continue
if
([self.collectionView
indexPathForCell:cell]
==
self.oldIndexPath)
{
continue;
}
//
計(jì)算中心距
CGFloat
space
=
sqrtf(pow(self.snapshotView.center.x
-
cell.center.x,
2)
+
powf(self.snapshotView.center.y
-
cell.center.y,
2));
//
如果相交一半就移動(dòng)
if
(space
<=
self.snapshotView.bounds.size.width
/
2)
{
self.moveIndexPath
=
[self.collectionView
indexPathForCell:cell];
//移動(dòng)
會(huì)調(diào)用willMoveToIndexPath方法更新數(shù)據(jù)源
[self.collectionView
moveItemAtIndexPath:self.oldIndexPath
toIndexPath:self.moveIndexPath];
//設(shè)置移動(dòng)后的起始indexPath
self.oldIndexPath
=
self.moveIndexPath;
break;
}
}
}
break;
default:
{
//
手勢(shì)結(jié)束和其他狀態(tài)
UICollectionViewCell
*cell
=
[self.collectionView
cellForItemAtIndexPath:self.oldIndexPath];
//
結(jié)束動(dòng)畫過(guò)程中停止交互,防止出問(wèn)題
self.collectionView.userInteractionEnabled
=
NO;
//
給截圖視圖一個(gè)動(dòng)畫移動(dòng)到隱藏cell的新位置
[UIView
animateWithDuration:0.25
animations:^{
self.
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 房地產(chǎn)底價(jià)包銷合同書
- 快速加載網(wǎng)頁(yè)資源管理措施
- 促進(jìn)跨部門合作提高迭代產(chǎn)出
- 金融風(fēng)險(xiǎn)管理基本原理與操作指南
- 五金配件銷售合同
- 農(nóng)產(chǎn)品種植收購(gòu)合同
- 2025年梧州貨運(yùn)從業(yè)資格證模擬考試駕考
- 委托人力資源協(xié)議
- 工程招投標(biāo)講義與合同管理
- 停車場(chǎng)委托經(jīng)營(yíng)管理合同
- 安全管理工作中形式主義及防止對(duì)策
- 2024年鄭州信息科技職業(yè)學(xué)院高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 藍(lán)牙基礎(chǔ)知識(shí)全解課件
- 運(yùn)動(dòng)損傷預(yù)防與處理的案例分析
- 第四次工業(yè)革命課件
- 2023-2024學(xué)年西安市高二數(shù)學(xué)第一學(xué)期期末考試卷附答案解析
- 企業(yè)2024年年度安全教育培訓(xùn)計(jì)劃
- 《微生物限度檢查法》課件
- Project-培訓(xùn)教學(xué)課件
- 秋風(fēng)詞賞析課件古詩(shī)詞賞析
- 福特F-150猛禽說(shuō)明書
評(píng)論
0/150
提交評(píng)論