关于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
在实现的过程中关于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
相关文章推荐
- iOS UITableView中关于cell里的按钮被点击时如何确定是哪一个section
- ios tableview/collectionView关于点击cell后 刷新cell
- 关于UITableView — cell上点击按钮变换
- iOS开发——UI进阶篇(四)tableView的全局刷新,局部刷新,左滑操作,左滑出现更多按钮,进入编辑模式,批量删除,自定义批量删除
- 解决tableView上cell的按钮点击效果不明显(轻点无效)
- 在uiview 的tableView中点击cell进入跳转到另一个界面的实现方法
- ios:点击tableView中的一个按钮,确定cell所在的行
- iOS UITableView中关于cell里的按钮被点击时如何确定是哪一个section
- tableView cell 左滑点击删除等点击按钮
- 关于tableview的知识总结,cell左划出现删除、置顶按钮
- iOS UITableView中关于cell里的按钮被点击时如何确定是哪一个section
- iOS UITableView中关于cell里的按钮被点击时如何确定是哪一个section
- 一个tableView的Cell中有两个点击按钮及tableView的重用
- UITableView中关于cell里的按钮被点击时如何确定是哪一个cell
- iOS UITableView中关于cell里的按钮被点击时如何确定是哪一个section
- ios tableView 自定义cell上的按钮点击事件不好用
- Cocos2d-x学习之---关于CCTableView中reloadData()操作,删除第一个/最后一个cell后tableview位置未刷新的问题
- 点击tableview里的cell后改变cell的背景图片
- 关于TableView中不止一个section的情况下首个cell的y轴不为0的会造成的问题和解决办法
- IOS tableView 点击一下cell,效果随离开触摸恢复(个人)