您的位置:首页 > 其它

关于tableView点击cell中按钮进入排序模式(cell行高统一可长按排序)

2016-08-30 00:00 429 查看
摘要: 前段时间遇到一个需求,发布帖子要做的跟豆瓣类似,长按cell之后cell的行高都变成统一的并且可以拖拽排序。长按手势结束之后cell恢复到原来的行高。
在实现的过程中关于cell位置的计算和手势的处理上遇到了很大的问题,最后只能做成点击cell中的按钮进入排序模式,把cell的行高变成统一的并可以长按排序。完成之后恢复行高。
在这里用到了一个关于tableview拖拽的三方类RTDragCellTableView,附上链接。这个类我在使用的时候添加了几句代码。全中文注释,比较适合初学者。

RTDragCellTableView: https://github.com/RustedBigB/RTDragCellTableView

首先,为三方的tableview类添加了一个isMove的BOOL属性,用于标记是否处于排序状态。

在三方tableview类里的长按的方法里判断isMove的值。如果不是排序状态直接return。

if (!self.isMove) {

return;

}

为自定义的cell声明一个代理,在点击cell中的按钮时,使用代理改变tableview的isMove的值,使tableview进入排序状态。

- (void)myTableViewCell:(MyTableViewCell *)cell funcBtnDidClick:(UIButton *)func {

#pragma mark -- 改变数据源数组;

NSMutableArray *arrayM = [NSMutableArrayarray];

//遍历数据源数组;

for (NSInteger i = 0; i < self.data.count; i ++) {

{//在这里是因为需要在排序模式下每一行的文字都需要能单独排序,

//所以在进入排序模式的时候对数据源做了一些处理。

RTModel *model = self.data[i];

if (model.title.length) {//判断数组对应位置的对象是不是文本属性;

//对应位置是字符串需要进行处理;

NSString *strA = model.title;

while ([strA rangeOfString:@"\n"].length) {//存在\n;

NSRange range= [strA rangeOfString:@"\n"];

NSString *subStr = [strA substringToIndex:range.location];

//加入数组;

RTModel *newModel = [[RTModelalloc]init];

newModel.title = subStr;

[arrayM addObject:newModel];

strA = [strA substringFromIndex:range.length+range.location];

}

//最后剩余的字符串不存在换行,所以需要单独添加。

RTModel *lastModel = [[RTModelalloc]init];

lastModel.title = strA;

[arrayM addObject:lastModel];

}

}else {//不是文本属性直接加入的可变数组

[arrayM addObject:model];

}

}

//改变数据数组;

self.data = arrayM.copy;

self.isMove = YES;

[_tableViewreloadData];

_tableView.isMove = YES;

}

在控制器的代理方法中刷新tableview,使cell的高度根据是否处于排序状态来返回固定值或者其他。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

RTModel *model = self.data[indexPath.row];

UIFont *font = [UIFontsystemFontOfSize:15];

NSDictionary *attribute = @{NSFontAttributeName: font};

CGSize size = CGSizeMake([UIScreenmainScreen].bounds.size.width, 0);

CGSize retSize = [model.titleboundingRectWithSize:size

options:\

NSStringDrawingTruncatesLastVisibleLine |

NSStringDrawingUsesLineFragmentOrigin |

NSStringDrawingUsesFontLeading

attributes:attribute

context:nil].size;

CGFloat h = retSize.height + 40;

//这里的高度计算纯粹为了演示,请按自己的需求返回。

returnself.isMove ? 40 : h ;

}

同理,在tableview的拖拽完成的代理方法里面将isMove的值改为no,继续刷新tableview。

- (void)cellDidEndMovingInTableView:(RTDragCellTableView *)tableView {

{

/*

在这里,如果不对数据源做处理排序完成后每一行文字就是一个cell,都会附带排序按钮,感觉上不是很好。

所以,在这里将相邻的cell模型如果是文字的内容就进行了合并,并在中间添加了“\n”使相邻的文本的cell成为一个cell。

*/

#pragma mark -- 移动完成后合并相邻的文字输入;

NSMutableArray *arrayM = [NSMutableArrayarray];

for (NSInteger i = 0; i < self.data.count; ) {

RTModel *model = self.data[i];

if (model.title.length) {

NSString *strNew = model.title;

while (++i < self.data.count&&[self.data[i] title].length) {

RTModel *nextModel = self.data[i];

strNew = [NSStringstringWithFormat:@"%@\n%@",strNew,nextModel.title];

}

RTModel *newModel = [[RTModelalloc]init];

newModel.title = strNew;

[arrayM addObject:newModel];

}else {//不是文本输入直接加入到新的可变数组;

[arrayM addObject:model];

i ++;

}

}

self.data = arrayM.copy;

}

self.isMove = NO;

[_tableViewreloadData];

_tableView.isMove = NO;

}

http://git.oschina.net/ruiruiheshui/RTDragCellTableView_test
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tableview 排序
相关文章推荐