首先分析一下系统cell删除的效果
1、手指轻轻划过和手指拖动,都能滑动视图露出删除按钮
2、视图滑动结束有回弹效果
3、手指一直左滑,视图会一直左移动,最后回弹至删除按钮左侧
4、左滑一次露出删除按钮,再左滑就恢复初始状态
5、露出删除按钮后,右滑和滚动tableView列表都能使该cell恢复初始状态
自定义删除cell
0、系统删除操作的动画细节很多,不只一个单一手势就能完成,所以我们只模仿主要交互动画,实现删除功能即可
1、滑动手势:我们能想到的有UIPanGestureRecognizer和UISwipeGestureRecognizer,我们一般用UIPanGestureRecognizer实现视图拖拽效果,而系统删除效果中手指轻扫一下就可以了,所以我们选择轻扫,放弃平移里在手指移动中,cell会跟着手指平移拖拽的效果,因为用两个手势的话,既费时也要判断好多情况,没必要完全实现系统效果
1.1 清扫手势在用的时候,还真因为无知跳了一个坑,不像其他手势那么简单,创建添加然后判断状态什么的就可以,一个UISwipeGestureRecognizer只能识别一个方向,所以我们这里要用到左滑和右滑就必须添加两个UISwipeGestureRecognizer
UISwipeGestureRecognizer *leftSwipe = [[UISwipeGestureRecognizer
alloc]initWithTarget:self action:@selector(swipeGesture:)];
[leftSwipe setDirection:UISwipeGestureRecognizerDirectionLeft];
[self.contentView addGestureRecognizer:leftSwipe];
UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGesture:)];
[rightSwipe setDirection:UISwipeGestureRecognizerDirectionRight];
[self.contentView addGestureRecognizer:rightSwipe];
1.2 UISwipeGestureRecognizer target方法
-(void)swipeGesture:(UISwipeGestureRecognizer*)gesture{
if(gesture.direction == UISwipeGestureRecognizerDirectionLeft){ //右扫
NSLog(@"左扫");
[self animateBottomView];
}else{
[self animateBottomView];
}
}
2、视图平移动画,有回弹效果:很简单,既然我们选择了轻扫,当识别手势左滑的时候(这里一定是第一次左滑,根据视图当前的originalX判断),利用UIView的animate动画实现视图X轴的改变就可以,回弹效果就是左移结束往右滑了一下嘛,很快的右滑一下
-(void)animateBottomView{
_deleteBtn.hidden = NO;
CGRect rect = _bottomView.frame;
if (rect.origin.x == originalX) { // 原位置
[UIView animateWithDuration:0.5 animations:^{
CGRect frame = CGRectMake(originalX-CGRectGetWidth(_deleteBtn.frame)-5, rect.origin.y, rect.size.width, rect.size.height);
_bottomView.frame = frame;
} completion:^(BOOL finished) { //动画结束,回弹效果
[UIView animateWithDuration:0.1 animations:^{
CGRect frame = CGRectMake(originalX-CGRectGetWidth(_deleteBtn.frame), rect.origin.y, rect.size.width, rect.size.height);
_bottomView.frame = frame;
}];
}];
}else if (rect.origin.x < originalX){ //此时状态是露出删除按钮的状态,恢复初始状态
[UIView animateWithDuration:0.5 animations:^{
CGRect frame = CGRectMake(originalX, rect.origin.y, rect.size.width, rect.size.height);
_bottomView.frame = frame;
} completion:^(BOOL finished) {
_deleteBtn.hidden = YES;
}];
}
}
总结
由此看来,我们是通过控制一个view的滑动去使底部的删除按钮露出来,那么不管是什么样的删除效果,删除按钮要以何种方式露出来就都不是问题了