如何实现UITableViewCell的侧滑删除功能呢?很简单的思路
给cell添加一个长按手势,然后根据手势的状态,在开始的时候给旋转三十度
在移动过程中,捕获快照
在结束的时候判断坐标值,给VIewController发一个删除cell的回调,同时TableView reloadData就可以了
@interface CustomTableViewCell ()
{
UIView *snapView;
}
@end
@implementation CustomTableViewCell
- (void)awakeFromNib {
_containerView.layer.cornerRadius=4;
_shadowView.layer.shadowColor=[UIColor blackColor].CGColor;
_shadowView.layer.shadowOffset=CGSizeMake(2, 2);
_shadowView.layer.shadowOpacity=0.5;
_shadowView.layer.shadowRadius=5;
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongpressGesture:)];
[self.contentView addGestureRecognizer:longPress];
}
- (void)handleLongpressGesture:(UILongPressGestureRecognizer *)gesture
{
CGPoint startPoint = CGPointZero;
switch (gesture.state) {
case UIGestureRecognizerStateBegan:
{
snapView = [_containerView snapshotViewAfterScreenUpdates:NO];
startPoint = [gesture locationInView:self.contentView];
//重设layer锚点
snapView.layer.anchorPoint = CGPointMake(startPoint.x/snapView.layer.frame.size.width-0.1, startPoint.y/snapView.layer.frame.size.height-0.1);
snapView.frame = _containerView.frame;
snapView.transform = CGAffineTransformMakeRotation(M_PI/30);
[self.contentView addSubview:snapView];
self.containerView.hidden = YES;
self.shadowView.hidden = YES;
break;
}
case UIGestureRecognizerStateChanged:
{
CGPoint changePoint = [gesture locationInView:self.contentView];
[UIView animateWithDuration:0.05 animations:^{
snapView.layer.position = changePoint;
}];
break;
}
case UIGestureRecognizerStateEnded:
{
NSLog(@"ended");
CGPoint endPoint = [gesture locationInView:self.contentView];
if (endPoint.x>self.contentView.bounds.size.width-50) {
if (self.cellBlock) {
self.cellBlock(YES, _cellIndex);
}
}else
{
if (self.cellBlock) {
self.cellBlock(NO, _cellIndex);
}
}
[snapView removeFromSuperview];
self.containerView.hidden = NO;
self.shadowView.hidden = NO;
break;
}
default:
break;
}
}
ViewController
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomTableViewCell *cell = (CustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"customCell"];
cell.cellIndex = indexPath;
cell.cellBlock = ^(BOOL isDelete, NSIndexPath *index){
if (isDelete) {
[_mTableView beginUpdates];
rowCount--;
[_mTableView deleteRowsAtIndexPaths:@[index] withRowAnimation:UITableViewRowAnimationRight];
[_mTableView endUpdates];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[_mTableView reloadData];
});
}
};
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
运行结果