# 多列类似Excel的TableView
来源:互联网 发布:portraiture mac 安装 编辑:程序博客网 时间:2024/06/05 06:17
之前项目需要,做过类似篮球比赛技术统计的功能。大家都知道,每只队伍有10多个球员,技术统计会包括:姓名、得分、篮板、助攻、盖帽、2分投篮、3分投篮、罚球……大概效果就类似Excel要做的。但是手机屏幕宽度有限,所以左右滑动成了一个需求。同时,为了保证滑动过程中也能直接明了的对上号,所以第一列姓名理应保持不动。
- 首列固定
- 向左滑动查看更多列
- 上拉刷新、下拉加载更多
代码块
1、宏定义
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)#define BPCOLOR(r,g,b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]#define BackgroundColor BPCOLOR(239, 239, 239)#define BPClearColor [UIColor clearColor]#define BPWhiteColor [UIColor whiteColor]#define BPRedColor [UIColor redColor]#define kNavHeight 64#define kHeaderHeight 49#define kCellHeight 60
2、基本控件-属性
@interface ViewController ()<UIScrollViewDelegate,UITableViewDelegate,UITableViewDataSource>@property (nonatomic, strong) UIScrollView *scrollView;@property (nonatomic, strong) UITableView *leftTableView;@property (nonatomic, strong) UITableView *rightTableView;@property (nonatomic, strong) UIView *leftHeaderView;@property (nonatomic, strong) UIView *rightHeaderView;@property (nonatomic, strong) NSMutableArray *dataArr;@property (nonatomic, strong) NSMutableArray *tempArr;@property (nonatomic, assign) NSInteger pageNum;@end
3、viewDidLoad
self.title = @"TableView"; self.view.backgroundColor = BackgroundColor; self.automaticallyAdjustsScrollViewInsets = NO; /** * scrollView */ _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, kNavHeight, SCREEN_WIDTH, SCREEN_HEIGHT-kNavHeight)]; _scrollView.bounces = NO; // 反弹 _scrollView.backgroundColor = BPWhiteColor; _scrollView.scrollEnabled = YES; _scrollView.delegate = self; [self.view addSubview:_scrollView]; /** * rightHeaderView */ _rightHeaderView = [[UIView alloc] initWithFrame:CGRectMake(SCREEN_WIDTH / 3, 0, SCREEN_WIDTH , kHeaderHeight)]; _rightHeaderView.backgroundColor = BPWhiteColor; UILabel *rightLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH/3, kHeaderHeight)]; rightLabel1.text = @"Right1"; rightLabel1.textColor = BPRedColor; rightLabel1.textAlignment = NSTextAlignmentCenter; [_rightHeaderView addSubview:rightLabel1]; UILabel *rightLabel2 = [[UILabel alloc] initWithFrame:CGRectMake(SCREEN_WIDTH/3, 0, SCREEN_WIDTH/3, kHeaderHeight)]; rightLabel2.text = @"Right2"; rightLabel2.textColor = BPRedColor; rightLabel2.textAlignment = NSTextAlignmentCenter; [_rightHeaderView addSubview:rightLabel2]; UILabel *rightLabel3 = [[UILabel alloc] initWithFrame:CGRectMake(SCREEN_WIDTH/3 * 2, 0, SCREEN_WIDTH/3, kHeaderHeight)]; rightLabel3.text = @"Right3"; rightLabel3.textColor = BPRedColor; rightLabel3.textAlignment = NSTextAlignmentCenter; [_rightHeaderView addSubview:rightLabel3]; UIView *lineView1 = [[UIView alloc] initWithFrame:CGRectMake(0, kHeaderHeight-1, _rightHeaderView.width, 1)]; lineView1.backgroundColor = BPCOLOR(217, 217, 217); [_rightHeaderView addSubview:lineView1]; /** * rightTableView */ _rightTableView = [[UITableView alloc] initWithFrame:CGRectMake(_rightHeaderView.x, 0, _rightHeaderView.width, _scrollView.height) style:UITableViewStylePlain]; _rightTableView.delegate = self; _rightTableView.dataSource = self; _rightTableView.backgroundColor = BPClearColor; _rightTableView.separatorStyle = UITableViewCellSeparatorStyleNone; _rightTableView.showsVerticalScrollIndicator = NO; [_scrollView addSubview:_rightTableView]; /** * leftHeaderView */ _leftHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, kHeaderHeight)]; _leftHeaderView.backgroundColor = BPClearColor; UIView *tempView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH / 3, kHeaderHeight)]; tempView.backgroundColor = BPWhiteColor; [_leftHeaderView addSubview:tempView]; UILabel *leftLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 100, kHeaderHeight)]; leftLabel.text = @"Left"; leftLabel.textColor = BPRedColor; [_leftHeaderView addSubview:leftLabel]; UIView *lineView2 = [[UIView alloc] initWithFrame:CGRectMake(0, kHeaderHeight-1, tempView.width, 1)]; lineView2.backgroundColor = BPCOLOR(217, 217, 217); [tempView addSubview:lineView2]; /** * leftTableView */ _leftTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, _scrollView.height) style:UITableViewStylePlain]; _leftTableView.delegate = self; _leftTableView.dataSource = self; _leftTableView.backgroundColor = BPClearColor; _leftTableView.separatorStyle = UITableViewCellSeparatorStyleNone; _leftTableView.showsVerticalScrollIndicator = NO; [_scrollView addSubview:_leftTableView]; _scrollView.contentSize = CGSizeMake(SCREEN_WIDTH / 3 * 4, _scrollView.height); [self setupRefresh];
4、刷新
- (void)setupRefresh{ self.leftTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNew)]; self.leftTableView.mj_header.automaticallyChangeAlpha = YES; [self.leftTableView.mj_header beginRefreshing]; self.leftTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMore)];}
逻辑
1、底层为一个屏幕大小的UIScrollerView;
2、rightTableView 加到UIScrollerView之上,需要注意的是它的.X和width.(leftTableView上固定的第一列的宽度就是rightTableView的x, 右边总共列数X列宽)。
3、leftTableView。leftTableView的width=屏幕宽度。之所以后加它到UIScrollerView上且宽度为屏幕宽度,是因为我们的上拉下拉刷新控件都由它来处理。宽度为屏幕宽度,那么就会盖住rightTableView了吧?没关系,有个属性:backgroundColor, 把设置 leftTableView,以及leftTableView的cell的backgroundColor设置为ClearColor;那么rightTableView就不会被盖住啦。 当然,leftTableView左边还有一列。在leftTableView的cell上自定义一个一定宽度的UIView就可以啦。
4、然后就是给leftTableView添加上拉下拉的刷新控件了。直接用MJRefresh,简单粗暴!
5、最重要的地方 - UIScrollerView Delegate
// leftTableView与rightTableView 上下滚动同步- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ if (self.leftTableView == scrollView) { [self.rightTableView setContentOffset:self.leftTableView.contentOffset]; } else if (self.rightTableView == scrollView) { [self.leftTableView setContentOffset:self.rightTableView.contentOffset]; } else if (self.rightScrollView == scrollView) { CGFloat contentXoffset = scrollView.contentOffset.x; self.leftTableView.x = contentXoffset; }}
leftTableView和rightTableView上下滚动同步,同时左右滑动scrollView,leftTableView.x随着scrollView的偏移量改变而改变,致使看上去水平方向它始终固定不动。
整个来讲,其实是为了达到目的不折手段。也看到在其他ipad项目里有更加屌爆的效果,可是找不到更有用的源码。之所以如此折腾还要搞成透明不透明的,最重要的一个原因就是刷新控件。
第一次写这玩意,请包涵。
- # 多列类似Excel的TableView
- UIScrollView实现重用机制(类似多列tableview)
- QT treeview实现类似tableview的效果
- 两列tableView或者多列tableView相关联
- 百度面试题-类似Excel列名的位置查找问题
- ArcGIS实现类似Excel表格的按序列填充及字段拼接功能
- 如何用DataGrid实现类似DataList多列的效果
- 类似Excel的表格选择
- iOS 类似excel的展示
- 一个可以实现 左右联动JTable 的完全Dialog 实现类似 Excel的冻结第一列 效果
- Excel多列数据的连接
- Excel 列的转换
- excel的列名
- 实现类似app store的tableview的显示更多
- IOS 类似iphone通讯录TableView的完整demo【附源码】
- iOS7中类似iOS6效果的Grouped TableView
- TableView类似QQ分组的折叠与展开
- iOS 类似股票数据显示的可上下左右滚动TableView
- 关于H5微信认证有关内容
- Android-三级联动更改样式
- 程序员的那些事儿 皆大欢喜的加薪
- Android应用与Java Web服务器保持Socket长连接
- linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结
- # 多列类似Excel的TableView
- 格式化字符串漏洞执行任意代码分析
- 左栏固定,右栏自适应布局
- 服务器开发之订单号生成策略
- 程序员的未来
- A%Bproblem
- Compile caffe while another caffe exists already
- 机房收费系统——上下机
- weblogic下 java.lang.NoSuchMethodError异常