iOS-TableView拖动Cell更换次序

效果:

长按某个Cell,Cell会有一个明显的弹起放大效果。这时候,你可以通过拖动cell和其他Cell更换顺序。

实现的原理:

1,浮层

长按后,UITableViewCell上会出现一个浮层,同时UITableViewCell隐藏。并且浮层可拖动。(对UITableViewCell生成一个快照)


 1 #pragma mark - Helper methods
2
3 /** @brief Returns a customized snapshot of a given view. */
4 - (UIView *)customSnapshoFromView:(UIView *)inputView {
5 UIView* snapshot = nil;
6
7 if ([[[UIDevice currentDevice] systemVersion] doubleValue] < 7.0) {
8 //ios7.0 以下通过截图形式保存快照
9 snapshot = [self customSnapShortFromViewEx:inputView];
10 }else{
11 //ios7.0 系统的快照方法
12 snapshot = [inputView snapshotViewAfterScreenUpdates:YES];
13 }
14
15 snapshot.layer.masksToBounds = NO;
16 snapshot.layer.cornerRadius = 0.0;
17 snapshot.layer.shadowOffset = CGSizeMake(-5.0, 0.0);
18 snapshot.layer.shadowRadius = 5.0;
19 snapshot.layer.shadowOpacity = 0.4;
20
21 return snapshot;
22 }
23
24 - (UIView *)customSnapShortFromViewEx:(UIView *)inputView
25 {
26 CGSize inSize = inputView.bounds.size;
27 // 下面方法,第一个参数表示区域大小。第二个参数表示是否是非透明的。如果需要显示半透明效果,需要传NO,否则传YES。第三个参数就是屏幕密度了
28 UIGraphicsBeginImageContextWithOptions(inSize, NO, [UIScreen mainScreen].scale);
29 [inputView.layer renderInContext:UIGraphicsGetCurrentContext()];
30 UIImage *image= UIGraphicsGetImageFromCurrentImageContext();
31 UIGraphicsEndImageContext();
32 UIImageView* snapshot = [[UIImageView alloc] initWithImage:image];
33
34 return snapshot;
35 }

2,更换某对UITableViewCell的位置

?





1

2

3

4

// ... update data source.

[_items exchangeObjectAtIndex:indexPath.row withObjectAtIndex:sourceIndexPath.row];             

// ... move the rows.

[_tableView moveRowAtIndexPath:sourceIndexPath toIndexPath:indexPath];

datasource里面的data的位置替换,同时将tableView的Cell位置替换。


 1 - (void)longPressGestureRecognized:(id)sender {
2
3 UILongPressGestureRecognizer *longPress = (UILongPressGestureRecognizer *)sender;
4 UIGestureRecognizerState state = longPress.state;
5
6 CGPoint location = [longPress locationInView:_tableView];
7 NSIndexPath *indexPath = [_tableView indexPathForRowAtPoint:location];
8
9 static UIView *snapshot = nil; ///< A snapshot of the row user is moving.
10 static NSIndexPath *sourceIndexPath = nil; ///< Initial index path, where gesture begins.
11
12 switch (state) {
13 case UIGestureRecognizerStateBegan: {
14 if (indexPath) {
15 sourceIndexPath = indexPath;
16
17 UITableViewCell *cell = [_tableView cellForRowAtIndexPath:indexPath];
18
19 // Take a snapshot of the selected row using helper method.
20 snapshot = [self customSnapshoFromView:cell];
21
22 // Add the snapshot as subview, centered at cell‘s center...
23 __block CGPoint center = cell.center;
24 snapshot.center = center;
25 snapshot.alpha = 0.0;
26 [_tableView addSubview:snapshot];
27 [UIView animateWithDuration:0.25 animations:^{
28
29 // Offset for gesture location.
30 center.y = location.y;
31 snapshot.center = center;
32 snapshot.transform = CGAffineTransformMakeScale(1.05, 1.05);
33 snapshot.alpha = 0.98;
34
35 cell.alpha = 0.0f;
36 } completion:^(BOOL finished) {
37 cell.hidden = YES;
38 }];
39 }
40 break;
41 }
42
43 case UIGestureRecognizerStateChanged: {
44 CGPoint center = snapshot.center;
45 center.y = location.y;
46 snapshot.center = center;
47
48 // Is destination valid and is it different from source?
49 if (indexPath && ![indexPath isEqual:sourceIndexPath]) {
50
51 // ... update data source.
52 [_items exchangeObjectAtIndex:indexPath.row withObjectAtIndex:sourceIndexPath.row];
53
54 // ... move the rows.
55 [_tableView moveRowAtIndexPath:sourceIndexPath toIndexPath:indexPath];
56
57 // ... and update source so it is in sync with UI changes.
58 sourceIndexPath = indexPath;
59 }
60 break;
61 }
62
63 default: {
64 // Clean up.
65 UITableViewCell *cell = [_tableView cellForRowAtIndexPath:sourceIndexPath];
66 [UIView animateWithDuration:0.25 animations:^{
67
68 snapshot.center = cell.center;
69 snapshot.transform = CGAffineTransformIdentity;
70 snapshot.alpha = 0.0;
71
72 cell.alpha = 1.0f;
73 } completion:^(BOOL finished) {
74 cell.hidden = NO;
75 [snapshot removeFromSuperview];
76 snapshot = nil;
77
78 }];
79 sourceIndexPath = nil;
80 break;
81 }
82 }
83 }

3,  ......似乎没有其他了吧?

你看,是不是很简单呢!只需要上面几行代码,你就可以实现一个稍微有点好看的UITableViewCell变换位置的效果了。

下载Demo

时间: 2024-10-15 00:41:28

iOS-TableView拖动Cell更换次序的相关文章

IOS TableView的Cell高度自适应,UILabel自动换行适应

原文链接 :http://blog.csdn.net/swingpyzf/article/details/18093959 需求: 1.表格里的UILable要求自动换行 2.创建的tableViewCell的高度会自动适应内容的高度 一.用xcode构建项目,创建一个有tableView的视图,用纯代码的形式实现: 1.创建一个UIViewController类,定义一个UITableView,实现TableView的委托和数据源协议 [objc] view plaincopyprint? /

[IOS Tableview] cell自定义view显示错误问题

问题介绍:按照tableviewcell的tag自定义cell的view显示的时候,会出现拖动时显示错误情况. 我做的是一个下载界面,我为了简化问题,就把问题设定为,tag==1的cell已下载,加载时就把已下载的cell的label显示为蓝色.其余默认为黑. 比如我在代码里,想要tag==1的cell的label字体为蓝色,这样写就会出现上下拖动时tag==11的也出现蓝色(视具体情况而定). if([cell.tag==1){ //tag==1就把label显示为蓝色 cell.label.

iOS 在TableView的Cell之间设置空白间隔空间

1.设置section的数目,即是你有多少个cell - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 3; // in your case, there are 3 cells } 2.对于每个section返回一个cell - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)secti

iOS Tableview侧滑删除和移动cell的实现

慕课网上学习了tableview的使用,突然让我觉得iOS比android简单多了,可能是我的感觉吧.因为android实现list view侧拉删除,动态移动item过程还是稍微有点复杂的.但是iOS却只需要重写几个方法就可以实现了.我只能说iOS太神奇!我就跟着做了一下. 项目地址:Todo 看效果,UI还可以.先上storyboard结构图: navigate controller 实现一个导航栏.view controller 实现一个tableview,tableviewCell .

iOS tableview cell 的展开收缩

iOS tableview cell 的展开收缩 #import "ViewController.h" @interface ViewController ()<UITableViewDataSource,UITableViewDelegate>{ NSMutableArray *_allArray;//创建一个数据源数组 NSMutableDictionary *dic;//创建一个字典进行判断收缩还是展开 } @property (nonatomic,strong)UI

ios tableview didSelectRowAtIndexPath方法中,获取某个cell的实例

选中tableView的某一行,触发如下方法: -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { } 若此时需要对tableview的cell做处理,就需要先得到改行cell对应的实例,可运用如下方法: UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 或者某个自定义cell

iOS 点击tableView的cell,让其滚到屏幕顶部

点击tableView的cell,让其滚到屏幕顶部,很多电商的分类模块,都采用这种做法 1. 示例代码 - (void)viewDidLoad { [super viewDidLoad]; [self addTableView]; } #pragma mark - 创建tableView - (void)addTableView { UITableView *tableView = [[UITableView alloc]init]; tableView.frame = self.view.bo

IOS Table中Cell的重用reuse机制分析

原文:http://blog.csdn.net/omegayy/article/details/7356823 创建UITableViewController子类的实例后,IDE生成的代码中有如下段落: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = [NSString

tableView中cell的重用机制

这里就涉及了TableView的重用机制,为了做到显示和数据分离,iOS tableView的实现并且不是为每个数据项创建一个tableCell.而是只创建屏幕可显示最大个数的cell,然后重复使用这些cell,对cell做单独的显示配置,来达到既不影响显示效果,又能充分节约内容的目的.下面简要分析一下它的实现原理. 重用实现分析 查看UITableView头文件,会找到visibleCells,和自己设想的一个reusableCells两个结构.visiableCells内保存当前显示的cel