1,創(chuàng)建collectionview的時候添加長按手勢
cellPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(cellMoveingAction:)];
[self.collectionView addGestureRecognizer:cellPress];
手勢最好聲明為全局的限书,這樣在后面通過手勢定位cell虫蝶,可以方便去修改每個cell上面的內(nèi)容
2,定義cell的抖動動畫
//開始抖動動畫
-(void)beginMove{
for (SYCollectionViewCell * cell in [self.collectionView visibleCells]) {
cell.disButton.hidden = NO;
[UIView animateWithDuration:0.1 delay:0 options:UIViewAnimationOptionRepeat | UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionAutoreverse animations:^{
cell.transform = CGAffineTransformMakeRotation(0.05);
} completion:nil];
}
}
//取消抖動動畫
-(void)endMove{
for (SYCollectionViewCell * cell in [self.collectionView visibleCells]) {
cell.disButton.hidden = YES;
[cell.layer removeAllAnimations];
}
}
3倦西,處理長按手勢
-(void)cellMoveingAction:(UILongPressGestureRecognizer *)sender{
NSIndexPath * index = [self.collectionView indexPathForItemAtPoint:[sender locationInView:self.collectionView]];
switch (sender.state) {
case UIGestureRecognizerStateBegan://手勢開始
{
//開始在特定的索引路徑上對cell(單元)進行Interactive Movement(交互式移動工作
[self.collectionView beginInteractiveMovementForItemAtIndexPath:index];
[self beginMove];
}
break;
case UIGestureRecognizerStateChanged://手勢開始移動
{
//在手勢作用期間更新交互移動的目標(biāo)位置能真。
[self.collectionView updateInteractiveMovementTargetPosition:[sender locationInView:self.collectionView]];
[self beginMove];
}
break;
case UIGestureRecognizerStateEnded://手勢結(jié)束
{
//在完成手勢動作后,結(jié)束交互式移動
[self.collectionView endInteractiveMovement];
[self endMove];
[self.collectionView reloadData];
}
break;
default:
{
//取消Interactive Movement扰柠。
[self.collectionView endInteractiveMovement];
}
break;
}
}
4粉铐,在collectionview的UICollectionViewDataSource方法里面交換數(shù)據(jù)源,然后刷新collectionview
-(void)collectionView:(UICollectionView *)collectionView moveItemAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
//這里不使用下面的語句是因為下面的語句是交換兩個數(shù)據(jù)源的位置
// [self.dataArray exchangeObjectAtIndex:sourceIndexPath.row withObjectAtIndex:destinationIndexPath.row];
//使用下面的方式卤档,使動畫看起來更流暢蝙泼,先移除要移動的數(shù)據(jù),然后在要放置的位置插入數(shù)據(jù)
NSString * sourceStr = self.dataArray[sourceIndexPath.row];
[self.dataArray removeObject:self.dataArray[sourceIndexPath.row]];
[self.dataArray insertObject:sourceStr atIndex:destinationIndexPath.row];
[self.collectionView reloadData];
}
這里寫下view的幾種動畫模式
1.常規(guī)動畫屬性設(shè)置(可以同時選擇多個進行設(shè)置)
UIViewAnimationOptionLayoutSubviews:動畫過程中保證子視圖跟隨運動劝枣。
UIViewAnimationOptionAllowUserInteraction:動畫過程中允許用戶交互汤踏。
UIViewAnimationOptionBeginFromCurrentState:所有視圖從當(dāng)前狀態(tài)開始運行。
UIViewAnimationOptionRepeat:重復(fù)運行動畫舔腾。
UIViewAnimationOptionAutoreverse :動畫運行到結(jié)束點后仍然以動畫方式回到初始點溪胶。
UIViewAnimationOptionOverrideInheritedDuration:忽略嵌套動畫時間設(shè)置。
UIViewAnimationOptionOverrideInheritedCurve:忽略嵌套動畫速度設(shè)置琢唾。
UIViewAnimationOptionAllowAnimatedContent:動畫過程中重繪視圖(注意僅僅適用于轉(zhuǎn)場動畫)载荔。
UIViewAnimationOptionShowHideTransitionViews:視圖切換時直接隱藏舊視圖盾饮、顯示新視圖采桃,而不是將舊視圖從父視圖移除(僅僅適用于轉(zhuǎn)場動畫)
UIViewAnimationOptionOverrideInheritedOptions :不繼承父動畫設(shè)置或動畫類型懒熙。
2.動畫速度控制(可從其中選擇一個設(shè)置)
UIViewAnimationOptionCurveEaseInOut:動畫先緩慢,然后逐漸加速普办。
UIViewAnimationOptionCurveEaseIn :動畫逐漸變慢工扎。
UIViewAnimationOptionCurveEaseOut:動畫逐漸加速。
UIViewAnimationOptionCurveLinear :動畫勻速執(zhí)行衔蹲,默認值肢娘。
3.轉(zhuǎn)場類型(僅適用于轉(zhuǎn)場動畫設(shè)置,可以從中選擇一個進行設(shè)置舆驶,基本動畫橱健、關(guān)鍵幀動畫不需要設(shè)置)
UIViewAnimationOptionTransitionNone:沒有轉(zhuǎn)場動畫效果。
UIViewAnimationOptionTransitionFlipFromLeft :從左側(cè)翻轉(zhuǎn)效果沙廉。
UIViewAnimationOptionTransitionFlipFromRight:從右側(cè)翻轉(zhuǎn)效果拘荡。
UIViewAnimationOptionTransitionCurlUp:向后翻頁的動畫過渡效果。
UIViewAnimationOptionTransitionCurlDown :向前翻頁的動畫過渡效果撬陵。
UIViewAnimationOptionTransitionCrossDissolve:舊視圖溶解消失顯示下一個新視圖的效果珊皿。
UIViewAnimationOptionTransitionFlipFromTop :從上方翻轉(zhuǎn)效果。
UIViewAnimationOptionTransitionFlipFromBottom:從底部翻轉(zhuǎn)效果巨税。
注:這里是這個練習(xí)的demo