拖拽cell 交换cell位置

#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

  

时间: 2024-09-30 07:03:11

拖拽cell 交换cell位置的相关文章

Android DragAndDrop API 拖拽效果 交换ListView的Item值

前言 Android系统自API Level11开始添加了关于控件拖拽的相关API,可以方便的实现控件的一些拖拽效果,而且比自己用Touch事件写的效果更好.下面就来看下DragAndDrop吧. 使用Android的DragAndDrop框架,我们可以方便的在当前布局中用拖拽的形式实现两个View之间数据的互换.DragAndDrop框架包括一个拖拽事件的类,拖拽监听器,以及一些帮助方法和类. 尽管DragAndDrop主要是为了数据移动而设计,但是我们也可用他做别的UI处理.举个例子,我们可

通过Ztree生成页面html元素Dom树,以及拖拽改变元素的位置

zTree 是一款依靠 jQuery 实现的多功能 "树插件",http://www.treejs.cn/v3/main.php#_zTreeInfo,功能强大,不多赘述. 下面我将介绍如何实现使用该插件生成HTML元素Dom树,并对其进行多样操作. 先贴上一个简单的HTML页面(直接拿的ztree的用的,画面简单实用,里面的文字内容不用在意) 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-e

百度地图的定位以及拖拽(显示坐标位置)

截图示例 <!doctype html> <html lang="en"> <head>  <meta charset="UTF-8">  <meta name="Generator" content="EditPlus?">  <meta name="Author" content="">  <meta na

可拖拽GridView代码解析

本片学习笔记是对eoe网上一个项目代码的解读,具体项目作者的博客如下:http://blog.csdn.net/vipzjyno1/article/details/26514543.项目源码下载地址为https://github.com/Rano1/TopNews本篇只对可拖拽的GridView的代码进行解读,同时修改了原项目中不必要的变量.去掉了不必要或者逻辑错误的代码,也删除了方法中不必要的局部变量和计算.通过对这个读这个代码,自己也着实学到了不少的东西(毕竟自己刚接触android不久,特

android开发游记:ItemTouchHelper 使用RecyclerView打造可拖拽的GridView

以下是RecyclerView结合ItemTouchHelper实现的列表和网格布局的拖拽效果. 效果图例如以下:(gif图有点顿卡,事实上执行是非常流畅的) demo下载地址: DragRecyclerView 怎样实现 那么是怎样实现的呢?主要就要使用到ItemTouchHelper ,ItemTouchHelper 是support-v7包中加入的一个帮助开发人员处理拖拽和滑动的实现类,它能够让你非常easy实现側滑删除.拖拽的功能. 我们仅仅须要实例化一个ItemTouchHelper.

九宫格拖拽与互换

以上是一个九宫格,要想实现元素的拖拽和互换,如点击A到E的位置是,A会拖拽到E的位置,E会自动返回到A的位置:代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>九宫格拖拽与交换</title> </head> <style type="text/css"> #content{width: 3

Android开发:拖拽

google官网的training和API两个地方都提到了拖拽的实现,两种方法不太一样. 方法一 training(https://developer.android.com/training/gestures/scale.html)中提到的方法是监听onTouchEvent,在ACTION_DOWN的时候记录位置,在ACTION_MOVE的时候获取坐标,改变拖拽的控件位置. 方法二 在android3.0及以上可以使用View.OnDragListener. 下面是我写的简单的demo: ac

QT笔记之自定义窗口拖拽移动

1.QT自定义标题栏,拖拽标题栏移动窗口(只能拖拽标题,其他位置无法拖拽) 方法一: 转载:http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html .h文件中 1 //自己重新实现拖动操作 2 protected: 3 4 void mouseMoveEvent ( QMouseEvent * event ); 5 6 void mousePressEvent ( QMouseEvent * event ); 7 8 void mouseRele

JS拖拽

拖拽原理    a, 被拖拽物体绝对定位    b, 按下时记录鼠标在拖拽物体上的位置,拖拽时鼠标在拖拽物体上的位置保持不变    c, 鼠标移动时改变拖拽物体位置 1,简易拖拽 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>拖拽原型</title> <script type="text/javascript" sr