背景
這個效果是今天公司項目里面遇上的太雨,也是第一次遇見這種需求哪替,所以記錄下來柱彻,效果如上圖拄查。需求主要是可以實現(xiàn)上下的滑動吁津,并且同時最左側(cè)的“線路名稱”這一列在向左滑動的時候是不能跟隨滾動的。這個功能主要是實現(xiàn)用戶可以方便查看關(guān)于一下難以看全的列表數(shù)據(jù)堕扶。下面說一下思路碍脏。
代碼大體思路
由上面的GIF圖和基本需求描述我們第一個想到的東西就是萬能的tableview,沒錯稍算,這個功能的完成當(dāng)然離不開tableview典尾,那么tableview應(yīng)該怎樣發(fā)揮它的功力呢,左右側(cè)的信息需要對稱糊探,所以在這里我使用了兩個tableview钾埂,也就是最左側(cè)線路名稱這一列是一個tableview,右側(cè)的粉紅色字體這些行是一個tableview科平。上下滑動兩者關(guān)聯(lián)是使用scrollview完成的褥紫。那接下來就結(jié)合代碼簡單說一下,也方便我以后回頭看瞪慧,哈哈哈髓考。
代碼解析
- 這是需要的原材料,每個變量都有注釋它的功能了弃酌,一眼懂氨菇。
titleTableView
是最左側(cè)的線路名稱這一列儡炼。infoTableView
是粉紅色字體這些。contentView
是titleTableView
和最上方(除了“線路名稱”)這一列內(nèi)容的superView
查蓉。
@property (nonatomic, strong) UITableView *titleTableView;//標(biāo)題TableView
@property (nonatomic, strong) UITableView *infoTableView;//內(nèi)容TableView
@property (nonatomic, strong) UIScrollView *contentView;//內(nèi)容容器
@property (nonatomic, strong) NSArray *infoArr;//數(shù)組
@end
@implementation ViewController {
CGFloat _kOriginX;
CGFloat _kScreenWidth;
CGFloat _kScreenHeight;
}
- 這是所需要的數(shù)據(jù)配置乌询,我把里面所有需要的數(shù)據(jù)都放在數(shù)組李典里面了誉碴。我比較懶做瞪。哈哈哈哈
- (void)configData {
_kOriginX = 120;
_kScreenWidth = self.view.frame.size.width;
_kScreenHeight = self.view.frame.size.height;
_infoArr = @[@{@"title":@"出團(tuán)日期", @"routeName":@"線路名稱一", @"time":@"2015/11/21", @"num":@"20", @"price":@"124.0", @"code":@"DAGSDSASA"},
@{@"title":@"余位", @"routeName":@"線路名稱二", @"time":@"2015/11/21", @"num":@"34", @"price":@"234", @"code":@"TAGDFASFAF"},
@{@"title":@"價格", @"routeName":@"線路名稱三", @"time":@"2015/11/21", @"num":@"12", @"price":@"634", @"code":@"GHGASDAS"},
@{@"title":@"團(tuán)代號", @"routeName":@"線路名稱四", @"time":@"2015/11/56", @"num":@"54", @"price":@"632", @"code":@"DAADSFAD"}];
}
- 分步來看,首先是頭部的坯台,這個
titleLabel
是最左上角的“線路名稱”這四個字聂沙,contentView
的配置秆麸,上面說了這個contentView
的作用的,從它的frame
看出來及汉,_contentView = [[UIScrollView alloc] initWithFrame:CGRectMake(_kOriginX, 0, _kScreenWidth - _kOriginX, _kScreenHeight)];
它的x
是_kOriginX
也就是預(yù)留的最左側(cè)的空間沮趣。最上面的一列使用for循環(huán)創(chuàng)建出來的label
。
//MARK:- 頭部視圖
- (void)configTableHeader {
UILabel *titleLabel = [self quickCreateLabelWithLeft:0 width:_kOriginX title:@"線路名稱"];
[self.view addSubview:titleLabel];
_contentView = [[UIScrollView alloc] initWithFrame:CGRectMake(_kOriginX, 0, _kScreenWidth - _kOriginX, _kScreenHeight)];
_contentView.delegate = self;
_contentView.showsVerticalScrollIndicator = NO;
_contentView.showsHorizontalScrollIndicator = NO;
_contentView.contentSize = CGSizeMake(400, _kScreenHeight);
_contentView.bounces = NO;
[self.view addSubview:_contentView];
for (int i = 0; i < _infoArr.count; i++) {
CGFloat x = i * 100;
UILabel *label = [self quickCreateLabelWithLeft:x width:100 title:[[_infoArr objectAtIndex: i] objectForKey:@"title"]];
label.textAlignment = NSTextAlignmentCenter;
[_contentView addSubview:label];
}
}
- 那接下來就是配置最左側(cè)那一欄和左側(cè)粉紅色字體那些行坷随。也就這兩個
tableview
創(chuàng)建的房铭。
//MARK:- 詳細(xì)內(nèi)容
- (void)configInfoView {
_titleTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 40, _kOriginX, _kScreenHeight) style:UITableViewStylePlain];
_titleTableView.dataSource = self;
_titleTableView.delegate = self;
_titleTableView.showsVerticalScrollIndicator = NO;
_titleTableView.showsHorizontalScrollIndicator = NO;
_titleTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
[self.view addSubview:_titleTableView];
_infoTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 40, 400, _kScreenHeight) style:UITableViewStylePlain];
_infoTableView.delegate = self;
_infoTableView.dataSource = self;
_infoTableView.showsVerticalScrollIndicator = NO;
_infoTableView.showsHorizontalScrollIndicator = NO;
_infoTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
[_contentView addSubview:_infoTableView];
}
- 這是tableview的代理方法實現(xiàn)。在
cellForRowAtIndexPath
這個代理方法中温眉,將兩個tableview
的cell
分開來寫缸匪。
//MARK:- UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return _infoArr.count;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (tableView == _titleTableView) {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"titleTable"];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"titleTable"];
}
cell.textLabel.textAlignment = NSTextAlignmentCenter;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.textLabel.text = [[_infoArr objectAtIndex:indexPath.row] objectForKey:@"routeName"];
cell.textLabel.textColor = [UIColor lightGrayColor];
cell.textLabel.font = [UIFont systemFontOfSize:14];
if (indexPath.row%2 == 1) {
cell.backgroundColor = [UIColor colorWithRed:218/255.0 green:218/255.0 blue:218/255.0 alpha:1];
} else {
cell.backgroundColor = [UIColor whiteColor];
}
return cell;
} else {
NSString *ident = @"InfoCell";
InfoCell *cell = [tableView dequeueReusableCellWithIdentifier:ident];
if (!cell) {
cell = [[[NSBundle mainBundle] loadNibNamed:@"InfoCell" owner:nil options:nil] lastObject];
}
if (indexPath.row%2 == 1) {
cell.backgroundColor = [UIColor colorWithRed:218/255.0 green:218/255.0 blue:218/255.0 alpha:1];
} else {
cell.backgroundColor = [UIColor whiteColor];
}
[cell setDataWithStr:[_infoArr objectAtIndex:indexPath.row]];
return cell;
}
}
//MARK:- UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 40;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"選中了%@", [_infoArr[indexPath.row] objectForKey:@"routeName"]);
}
- 這個方法就是實現(xiàn)上下滑動時候,左側(cè)和右側(cè)
tableview
聯(lián)動的實現(xiàn)方法类溢。
//MARK:- UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView == _titleTableView) {
[_infoTableView setContentOffset:CGPointMake(_infoTableView.contentOffset.x, _titleTableView.contentOffset.y)];
}
if (scrollView == _infoTableView) {
[_titleTableView setContentOffset:CGPointMake(0, _infoTableView.contentOffset.y)];
}
}
總結(jié)
啊凌蔬,寫完感覺也是比較簡單,就是基本方法的配合使用闯冷,當(dāng)時想的時候也是沒有能一下想出來砂心,還是自己基本功不好的原因吧。把這個效果的實現(xiàn)記錄在這里蛇耀,也是為了提醒自己辩诞,也就是這個功能比較簡單,但是再怎樣的功能都是靠最基本的東西堆砌的纺涤。思想很重要译暂,但是最重要的還是去實現(xiàn),光想沒有用撩炊,人不是靠嘴活的外永。與君共勉。
額拧咳,這個是我打著盹寫完的象迎,如果您看到這里了,真的是特別感謝呛踊,有點兒困了砾淌,北京,晚安谭网。