#import "ViewController.h"
@interface ViewController ()<UITableViewDelegate ,UITableViewDataSource>
@end
@implementation ViewController
{
    
    UITableView * _tableView;
    
    
    NSMutableArray * _obj;
    
}
- (void)viewDidLoad {
    [super viewDidLoad];
    _tableView = [[UITableView alloc]init];
    
    _tableView.frame = self.view.bounds;
    
    [self.view addSubview:_tableView];
   
    _tableView.delegate = self;
    
    _tableView.dataSource = self;
//    [_tableView setEditing:YES animated:YES];
    UILongPressGestureRecognizer * longpress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longpress:)];
    
    [_tableView addGestureRecognizer:longpress];
    
    _obj = [NSMutableArray arrayWithCapacity:10];
    
    for (int i = 0; i<50 ; i++) {
        
        
        
        [_obj addObject:[NSNumber numberWithInt:i]];
    }
    
    _tableView.backgroundView =  [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"1"]];
   
    
//    [self tableView:nil moveRowAtIndexPath:nil toIndexPath:nil];
}
//-(BOOL)tableView:(UITableView *) tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
//{
//    //打开编辑
//    return YES;
//}
//- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
//{
//    //允许移动
//    return YES;
//    //return NO;
//}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    
    return _obj.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    
    
    if (!cell) {
        
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
        
    }
    cell.textLabel.text = [NSString stringWithFormat:@"%ld" , indexPath.row];
    cell.contentView.backgroundColor = [UIColor lightGrayColor];
    return cell;
}
- (void)longpress:(id)sender {
    
    
    UILongPressGestureRecognizer * longpress = (UILongPressGestureRecognizer *)sender;
    
    UIGestureRecognizerState state = longpress.state;
    
    CGPoint location = [longpress locationInView:_tableView];
    
    NSIndexPath * indexPath = [_tableView indexPathForRowAtPoint:location];
    
    static UIView * snapshot = nil;
    
    static NSIndexPath * sourceIndexPath = nil;
    
    switch (state) {
        case UIGestureRecognizerStateBegan:
            
            if (indexPath) {
                
                sourceIndexPath = indexPath;
                
                UITableViewCell * cell = [_tableView cellForRowAtIndexPath:indexPath];
                //截屏快照
                snapshot = [self customSnapsFromView:cell];
                
                
                __block CGPoint center = cell.center;
                
                snapshot.center = center;
                
                snapshot.alpha = 0.0;
                
                [_tableView addSubview:snapshot];
                
                [UIView animateWithDuration:0.25 animations:^{
                    
                   
                    center.y = location.y;
                    
                    snapshot.center = center;
                    
                    snapshot.transform = CGAffineTransformMakeScale(1.05, 1.05);
                    
                    snapshot.alpha = 0.98;
                    
                    cell.alpha = 0.0f;
                    
                }completion:^(BOOL finished) {
                    
                    cell.hidden = YES;
                    
                }];
                
            }
            
            
            break;
            
        case UIGestureRecognizerStateChanged:{
            
            CGPoint center = snapshot.center;
            center.y = location.y;
            
            snapshot.center = center;
            
            if (indexPath && ![indexPath isEqual:sourceIndexPath]) {
                
                //交换数组元素的位置
                [_obj exchangeObjectAtIndex:indexPath.row withObjectAtIndex:sourceIndexPath.row];
                
          //交换cell的位置
                [_tableView moveRowAtIndexPath:sourceIndexPath toIndexPath:indexPath];
                
                
                sourceIndexPath = indexPath;
            }
        
            
            break;
        }
            
            
            
           
            
        default:
            
        {
            
            UITableViewCell * cell = [_tableView cellForRowAtIndexPath:indexPath];
            
            [UIView animateWithDuration:0.25 animations:^{
                
                snapshot.center = cell.center;
                
                snapshot.transform = CGAffineTransformIdentity;
                
                snapshot.alpha = 0.0;
                
                cell.alpha = 1.0f;
            }completion:^(BOOL finished) {
                
               
                cell.hidden = NO;
                
                [snapshot removeFromSuperview];
                
                snapshot = nil;
                
            }];
            
            sourceIndexPath = nil;
              break;
        }
            
          
    }
    
    
}
-(UIView *)customSnapsFromView:(UIView *)inputView {
    
    UIView * snapshot = nil;
    //7.0一下的系统版本 截图快照
    if ([[[UIDevice currentDevice]systemVersion]doubleValue]<7.0) {
        
        snapshot = [self customSnapShortFromViewEx:inputView];
        
    }else{
        
        snapshot = [inputView snapshotViewAfterScreenUpdates:YES];
    }
    
    snapshot.layer.masksToBounds = NO;
    
    snapshot.layer.cornerRadius = 0.0;
    
    snapshot.layer.shadowOffset = CGSizeMake(-5.0, 0.0);
    
    snapshot.layer.shadowRadius = 5.0;
    
    snapshot.layer.shadowOpacity = 0.4;
    
    
    return snapshot;
    
}
-(UIView *)customSnapShortFromViewEx:(UIView *)inputView {
    
    
    CGSize inSize = inputView.bounds.size;
// 下面方法,第一个参数表示区域大小。第二个参数表示是否是非透明的。如果需要显示半透明效果,需要传NO,否则传YES。第三个参数就是屏幕分辨率
    UIGraphicsBeginImageContextWithOptions(inSize, NO, [UIScreen mainScreen].scale);
    
    [inputView.layer renderInContext:UIGraphicsGetCurrentContext()];
    
    UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    UIImageView * snapshot = [[UIImageView alloc]initWithImage:image];
    
    return snapshot;
    
    
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
    
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    return 64.0f;
}
@end
原文:http://www.cnblogs.com/yuwei0911/p/5688887.html