背景
screenCut.gif
這個效果是今天公司專案裡面遇上的,也是第一次遇見這種需求,所以記錄下來,效果如上圖。需求主要是可以實現上下的滑動,並且同時最左側的“線路名稱”這一列在向左滑動的時候是不能跟隨滾動的。這個功能主要是實現使用者可以方便檢視關於一下難以看全的列表資料。下面說一下思路。
程式碼大體思路
由上面的GIF圖和基本需求描述我們第一個想到的東西就是萬能的tableview,沒錯,這個功能的完成當然離不開tableview,那麼tableview應該怎樣發揮它的功力呢,左右側的資訊需要對稱,所以在這裡我使用了兩個tableview,也就是最左側線路名稱這一列是一個tableview,右側的粉紅色字型這些行是一個tableview。上下滑動兩者關聯是使用scrollview完成的。那接下來就結合程式碼簡單說一下,也方便我以後回頭看,哈哈哈。
程式碼解析
- 這是需要的原材料,每個變數都有註釋它的功能了,一眼懂。
titleTableView
是最左側的線路名稱這一列。infoTableView
是粉紅色字型這些。contentView
是titleTableView
和最上方(除了“線路名稱”)這一列內容的superView
。
1 2 3 4 5 6 7 8 9 10 11 12 |
@property (nonatomic, strong) UITableView *titleTableView;//標題TableView @property (nonatomic, strong) UITableView *infoTableView;//內容TableView @property (nonatomic, strong) UIScrollView *contentView;//內容容器 @property (nonatomic, strong) NSArray *infoArr;//陣列 @end @implementation ViewController { CGFloat _kOriginX; CGFloat _kScreenWidth; CGFloat _kScreenHeight; } |
- 這是所需要的資料配置,我把裡面所有需要的資料都放在陣列李典裡面了。我比較懶。哈哈哈哈
1 2 3 4 5 6 7 8 9 10 |
- (void)configData { _kOriginX = 120; _kScreenWidth = self.view.frame.size.width; _kScreenHeight = self.view.frame.size.height; _infoArr = @[@{@"title":@"出團日期", @"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":@"團代號", @"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
也就是預留的最左側的空間。最上面的一列使用for迴圈建立出來的label
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//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]; } } |
- 那接下來就是配置最左側那一欄和左側粉紅色字型那些行。也就這兩個
tableview
建立的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//MARK:- 詳細內容 - (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的代理方法實現。在
cellForRowAtIndexPath
這個代理方法中,將兩個tableview
的cell
分開來寫。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
//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"]); } |
- 這個方法就是實現上下滑動時候,左側和右側
tableview
聯動的實現方法。
1 2 3 4 5 6 7 8 9 |
//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)]; } } |
總結
啊,寫完感覺也是比較簡單,就是基本方法的配合使用,當時想的時候也是沒有能一下想出來,還是自己基本功不好的原因吧。把這個效果的實現記錄在這裡,也是為了提醒自己,也就是這個功能比較簡單,但是再怎樣的功能都是靠最基本的東西堆砌的。思想很重要,但是最重要的還是去實現,光想沒有用,人不是靠嘴活的。與君共勉。
額,這個是我打著盹寫完的,如果您看到這裡了,真的是特別感謝,有點兒困了,北京,晚安。
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!
任選一種支付方式