1,创建collectionview的时候添加长按手势
cellPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(cellMoveingAction:)];
[self.collectionView addGestureRecognizer:cellPress];
手势最好声明为全局的,这样在后面通过手势定位cell,可以方便去修改每个cell上面的内容
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://手势开始移动
{
//在手势作用期间更新交互移动的目标位置。
[self.collectionView updateInteractiveMovementTargetPosition:[sender locationInView:self.collectionView]];
[self beginMove];
}
break;
case UIGestureRecognizerStateEnded://手势结束
{
//在完成手势动作后,结束交互式移动
[self.collectionView endInteractiveMovement];
[self endMove];
[self.collectionView reloadData];
}
break;
default:
{
//取消Interactive Movement。
[self.collectionView endInteractiveMovement];
}
break;
}
}
4,在collectionview的UICollectionViewDataSource方法里面交换数据源,然后刷新collectionview
-(void)collectionView:(UICollectionView *)collectionView moveItemAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
//这里不使用下面的语句是因为下面的语句是交换两个数据源的位置
// [self.dataArray exchangeObjectAtIndex:sourceIndexPath.row withObjectAtIndex:destinationIndexPath.row];
//使用下面的方式,使动画看起来更流畅,先移除要移动的数据,然后在要放置的位置插入数据
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.常规动画属性设置(可以同时选择多个进行设置)
UIViewAnimationOptionLayoutSubviews:动画过程中保证子视图跟随运动。
UIViewAnimationOptionAllowUserInteraction:动画过程中允许用户交互。
UIViewAnimationOptionBeginFromCurrentState:所有视图从当前状态开始运行。
UIViewAnimationOptionRepeat:重复运行动画。
UIViewAnimationOptionAutoreverse :动画运行到结束点后仍然以动画方式回到初始点。
UIViewAnimationOptionOverrideInheritedDuration:忽略嵌套动画时间设置。
UIViewAnimationOptionOverrideInheritedCurve:忽略嵌套动画速度设置。
UIViewAnimationOptionAllowAnimatedContent:动画过程中重绘视图(注意仅仅适用于转场动画)。
UIViewAnimationOptionShowHideTransitionViews:视图切换时直接隐藏旧视图、显示新视图,而不是将旧视图从父视图移除(仅仅适用于转场动画)
UIViewAnimationOptionOverrideInheritedOptions :不继承父动画设置或动画类型。
2.动画速度控制(可从其中选择一个设置)
UIViewAnimationOptionCurveEaseInOut:动画先缓慢,然后逐渐加速。
UIViewAnimationOptionCurveEaseIn :动画逐渐变慢。
UIViewAnimationOptionCurveEaseOut:动画逐渐加速。
UIViewAnimationOptionCurveLinear :动画匀速执行,默认值。
3.转场类型(仅适用于转场动画设置,可以从中选择一个进行设置,基本动画、关键帧动画不需要设置)
UIViewAnimationOptionTransitionNone:没有转场动画效果。
UIViewAnimationOptionTransitionFlipFromLeft :从左侧翻转效果。
UIViewAnimationOptionTransitionFlipFromRight:从右侧翻转效果。
UIViewAnimationOptionTransitionCurlUp:向后翻页的动画过渡效果。
UIViewAnimationOptionTransitionCurlDown :向前翻页的动画过渡效果。
UIViewAnimationOptionTransitionCrossDissolve:旧视图溶解消失显示下一个新视图的效果。
UIViewAnimationOptionTransitionFlipFromTop :从上方翻转效果。
UIViewAnimationOptionTransitionFlipFromBottom:从底部翻转效果。
注:这里是这个练习的demo