转载

iOS表格的移动和删除

iOS表格有UICollectionView、UITableView两种格式,下面简单的整理了一下这两种表格的移动和删除方法,有说得不对的请指正。

一、UICollectionView表格

不多说,直接上代码

UIViewController里实现
@property (nonatomic, retain) UIImageView *delectImg;//回收站
/**之前选中cell的NSIndexPath*/
@property (nonatomic, strong) NSIndexPath *oldIndexPath;
/**单元格的截图*/
@property (nonatomic, strong) UIView *snapshotView;
/**之前选中cell的NSIndexPath*/
@property (nonatomic, strong) NSIndexPath *moveIndexPath;
/*数据源*/
@property(nonatomic,retain)NSMutableArray *title_Arr;
//创建UICollectionView
self.title_Arr = [NSMutableArray arrayWithObjects:@"少",@"壮",@"不",@"努",@"力",@"老",@"大",@"徒",@"伤",@"悲", nil];
self.title=@"UICollectionView";
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 64, SCREEN_WIDTH, SCREEN_HEIGHT-64-50) collectionViewLayout:flowLayout];
self.collectionView.backgroundColor=[UIColor blueColor];
self.collectionView.dataSource = self;
self.collectionView.delegate = self;
self.collectionView.backgroundColor = [UIColor whiteColor];
[self.collectionView registerClass:[MoveCollectionViewCell class] forCellWithReuseIdentifier:@"uicollectionviewcell"];
[self.view addSubview:self.collectionView = self.collectionView];
//回收站
self.delectImg=[[UIImageView alloc]initWithFrame:CGRectMake(SCREEN_WIDTH-110, SCREEN_HEIGHT-210, 80, 80)];
UIImage *i = [UIImage imageNamed:@"btn_delete-application_sel.png"];
self.delectImg.image=i;
// 添加长按手势
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handlelongGesture:)];
[self.collectionView addGestureRecognizer:longPress];

pragma mark - UICollectionViewDataSource实现代理

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    return self.title_Arr.count;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    MoveCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"uicollectionviewcell" forIndexPath:indexPath];
    cell.nameLab.text  = self.title_Arr[indexPath.row];;
    return cell;
}
//定义每个section的个数
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
    return 1;
}
//定义每个UICollectionView 的大小(返回CGSize:宽度和高度)
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
    return CGSizeMake(63, 103);
}
//定义每个UICollectionView 的间距(返回UIEdgeInsets:上、左、下、右)
-(UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
    return UIEdgeInsetsMake(20, (SCREEN_WIDTH-252)/5, 10, (SCREEN_WIDTH-252)/5);
}
//两个cell之间的间距(同一行的cell的间距)
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{
    return 10;
}
//这个是两行cell之间的间距(上下行cell的间距)
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{
    return 30;
}

pragma mark - 长按手势

- (void)handlelongGesture:(UILongPressGestureRecognizer *)longPress
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] < 9.0) {
        [self action:longPress];
    } else {
        [self iOS9_Action:longPress];
    }
}
//iOS9之后的实现
#pragma mark - iOS9 之后的方法
- (BOOL)collectionView:(UICollectionView *)collectionView canMoveItemAtIndexPath:(NSIndexPath *)indexPath
{
    // 返回YES允许row移动
    return YES;
}
- (void)collectionView:(UICollectionView *)collectionView moveItemAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
    //取出移动row数据
    id alldata = self.title_Arr[sourceIndexPath.row];
    //从数据源中移除该数据
    [self.title_Arr removeObject:alldata];
    //将数据插入到数据源中的目标位置
    [self.title_Arr insertObject:alldata atIndex:destinationIndexPath.row];
}
- (void)iOS9_Action:(UILongPressGestureRecognizer *)longPress
{
    switch (longPress.state) {
        case UIGestureRecognizerStateBegan:{ //手势开始
            //判断手势落点位置是否在row上
            [self.view addSubview:self.delectImg];
            NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:[longPress locationInView:self.collectionView]];
            [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"indexPath"];
            [[NSUserDefaults standardUserDefaults] setInteger:indexPath.row forKey:@"indexPath"];
            [[NSUserDefaults standardUserDefaults] synchronize];
            if (indexPath == nil) {
                break;
            }
            UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];
            [self.view bringSubviewToFront:cell];
            //iOS9方法 移动cell
            [self.collectionView beginInteractiveMovementForItemAtIndexPath:indexPath];
        }
            break;
        case UIGestureRecognizerStateChanged:
        { // 手势改变
            // iOS9方法 移动过程中随时更新cell位置
            [self.collectionView updateInteractiveMovementTargetPosition:[longPress locationInView:self.collectionView]];
            CGPoint endPoint = [longPress locationInView:self.view];
            CGFloat longS = sqrt(pow((endPoint.x-SCREEN_WIDTH+60), 2) + pow((endPoint.y-SCREEN_HEIGHT+180), 2));
            if (longS <= 160) {
                self.delectImg.frame = CGRectMake(SCREEN_WIDTH-120, SCREEN_HEIGHT-200, 100, 100);
            } 
        }
            break;
        case UIGestureRecognizerStateEnded:
        { // 手势结束
            // iOS9方法 移动结束后关闭cell移动 
            NSInteger indexPath= [[NSUserDefaults standardUserDefaults]integerForKey:@"indexPath"];
            NSIndexPath *indexPathStr = [self.collectionView indexPathForItemAtPoint:[longPress locationInView:self.collectionView]];
            if (indexPathStr == nil) {
                CGPoint endPoint = [longPress locationInView:self.view];
                CGFloat longS = sqrt(pow((endPoint.x-SCREEN_WIDTH+60), 2) + pow((endPoint.y-SCREEN_HEIGHT+180), 2));
                if (longS <= 160) {
                    [self CancelAttention:indexPath];
                }
            }
            [self.collectionView endInteractiveMovement];
            [self.delectImg removeFromSuperview];
            self.delectImg.frame=CGRectMake(SCREEN_WIDTH-110, SCREEN_HEIGHT-210, 80, 80);
        }
            break;
        default: //手势其他状态
            [self.collectionView cancelInteractiveMovement];
            break;
    }
}
//.iOS9之前的实现
#pragma mark - iOS9 之前的方法
- (void)action:(UILongPressGestureRecognizer *)longPress
{
    switch (longPress.state) {
        case UIGestureRecognizerStateBegan:
        { // 手势开始
            //判断手势落点位置是否在row上
            NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:[longPress locationInView:self.collectionView]];
            self.oldIndexPath = indexPath;
            if (indexPath == nil) {
                break;
            }
            UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];
            // 使用系统的截图功能,得到cell的截图视图
            UIView *snapshotView = [cell snapshotViewAfterScreenUpdates:NO];
            snapshotView.frame = cell.frame;
            [self.view addSubview:self.snapshotView = snapshotView];
            // 截图后隐藏当前cell
            cell.hidden = YES;
            CGPoint currentPoint = [longPress locationInView:self.collectionView];
            [UIView animateWithDuration:0.25 animations:^{
                snapshotView.transform = CGAffineTransformMakeScale(1.05, 1.05);
                snapshotView.center = currentPoint;
            }];
        }
            break;
        case UIGestureRecognizerStateChanged:
        { // 手势改变
            //当前手指位置 截图视图位置随着手指移动而移动
            CGPoint currentPoint = [longPress locationInView:self.collectionView];
            self.snapshotView.center = currentPoint;
            // 计算截图视图和哪个可见cell相交
            for (UICollectionViewCell *cell in self.collectionView.visibleCells) {
                // 当前隐藏的cell就不需要交换了,直接continue
                if ([self.collectionView indexPathForCell:cell] == self.oldIndexPath) {
                    continue;
                }
                // 计算中心距
                CGFloat space = sqrtf(pow(self.snapshotView.center.x - cell.center.x, 2) + powf(self.snapshotView.center.y - cell.center.y, 2));
                // 如果相交一半就移动
                if (space <= self.snapshotView.bounds.size.width / 2) {
                    self.moveIndexPath = [self.collectionView indexPathForCell:cell];
                    //移动 会调用willMoveToIndexPath方法更新数据源
                    [self.collectionView moveItemAtIndexPath:self.oldIndexPath toIndexPath:self.moveIndexPath];
                    //设置移动后的起始indexPath
                    self.oldIndexPath = self.moveIndexPath;
                    break;
                }
            }
        }
            break;
        default:
        { // 手势结束和其他状态
            UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:self.oldIndexPath];
            // 结束动画过程中停止交互,防止出问题
            self.collectionView.userInteractionEnabled = NO;
            [self.delectImg removeFromSuperview];
            // 给截图视图一个动画移动到隐藏cell的新位置
            [UIView animateWithDuration:0.25 animations:^{
                self.snapshotView.center = cell.center;
                self.snapshotView.transform = CGAffineTransformMakeScale(1.0, 1.0);
            } completion:^(BOOL finished) {
                // 移除截图视图,显示隐藏的cell并开始交互
                [self.snapshotView removeFromSuperview];
                cell.hidden = NO;
                self.collectionView.userInteractionEnabled = YES;
            }];
        }
            break;
    }
}
//删除应用
-(void)CancelAttention:(NSInteger)index{
    [self.title_Arr removeObjectAtIndex:index];
    [self.collectionView reloadData];
}
MoveCollectionViewCell里实现
-(id)initWithFrame:(CGRect)frame{
    self=[super initWithFrame:frame];
    if (self) {
        [self addSubview:self.nameLab];
    }
    return self;
}
-(UILabel *)nameLab{
    if (!_nameLab) {
        self.nameLab=[[UILabel alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame))];
        self.nameLab.textColor=[UIColor blackColor];
        self.nameLab.lineBreakMode=NSLineBreakByWordWrapping;
        self.nameLab.backgroundColor= [UIColor redColor];
        self.nameLab.numberOfLines = 0;
        self.nameLab.font=[UIFont systemFontOfSize:16];
        self.nameLab.textAlignment=NSTextAlignmentCenter;
    }
    return _nameLab;
}

二、UITableView表格

UIViewController里实现
@property (nonatomic, strong) UITableView *myTableView;
//创建UITableView
self.title=@"UITableView";
self.myTableView  = [[UITableView alloc] initWithFrame:CGRectMake(0, 64, SCREEN_WIDTH, SCREEN_HEIGHT-64-50) style:UITableViewStylePlain];
self.myTableView.delegate = self;
self.myTableView.dataSource = self;
self.myTableView.scrollEnabled = YES;
self.myTableView.backgroundColor = [UIColor groupTableViewBackgroundColor];
self.myTableView.showsVerticalScrollIndicator = NO;
[self.myTableView setEditing:YES animated:YES];
[self.view addSubview:self.myTableView];

pragma mark--- UITableViewDataSource,UITableViewDelegate代理实现

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 60;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return  self.title_Arr.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *identifier = @"UITableViewCell";
    MoveTableViewCell *tableCell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (tableCell == nil) {
        tableCell = [[MoveTableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier];
    }
//    tableCell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
    [tableCell name:self.title_Arr[indexPath.row]];
    return tableCell;
}
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{
    return YES;
}
//确认编辑类型
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewCellEditingStyleDelete;
}
//移动方法
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
    // 更换数据的顺序
    [self.title_Arr exchangeObjectAtIndex:sourceIndexPath.row withObjectAtIndex:destinationIndexPath.row];
}
//删除方法
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // 1.删除数据
        [self.title_Arr removeObjectAtIndex:indexPath.row];
        // 2.更新UITableView UI界面
        // [tableView reloadData];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
}
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath {
    return @"删除";
}
MoveTableViewCell里实现
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        //设置点击样式
        self.selectionStyle = UITableViewCellSelectionStyleNone;
        //添加子控件
        [self addSubViews];
    }
    return self;
}
#pragma mark---添加子控件
- (void)addSubViews{
    self.name_lab =[[UILabel alloc] initWithFrame:CGRectMake(50, 0, SCREEN_WIDTH-100, 60)];
    self.name_lab.adjustsFontSizeToFitWidth = YES;
    self.name_lab.font = [UIFont systemFontOfSize:16];
    self.name_lab.numberOfLines = 0;
    self.name_lab.textColor= [UIColor darkTextColor];
    self.name_lab.textAlignment = NSTextAlignmentLeft;
    [self addSubview:self.name_lab];
}
- (void)name:(NSString *)nameStr{
    self.name_lab.text = nameStr;
}


正文到此结束
Loading...