参考网址 https://www.jianshu.com/p/b2589fff500a
#import "ViewController.h"
#import "HeaderCollectionReusableView.h"
#import "TKYDataBankCell.h"
#define leftTableWidth [UIScreen mainScreen].bounds.size.width *0.3
#define rightTableWidth [UIScreen mainScreen].bounds.size.width *0.7
#define ScreenWidth [UIScreen mainScreen].bounds.size.width
#define ScreenHeight [UIScreen mainScreen].bounds.size.height
#define leftCellIdentifier @"leftCellIdentifier"
NSString*identifier =@"cell";
NSString*headerIdentifier =@"header";
NSString*footerIdentifier =@"footer";
@interface ViewController ()
@property (nonatomic, weak) UITableView *leftTableView;
@property(nonatomic,strong)UICollectionView*rightCollectionView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.leftTableView];
[self initCollectionView];
// Do any additional setup after loading the view, typically from a nib.
}
#pragma mark - tableView 数据源代理方法 -
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section {
return 40;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView {
return 1;
}
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
UITableViewCell *cell;
// 左边的 view
if(tableView ==self.leftTableView) {
cell = [tableViewdequeueReusableCellWithIdentifier:leftCellIdentifier forIndexPath:indexPath];
cell.textLabel.text = [NSString stringWithFormat:@"%ld", indexPath.row];
}
returncell;
}
#pragma mark - UITableViewDelegate 代理方法 -
//- (void)tableView:(UITableView *)tableView didEndDisplayingHeaderView:(UIView *)view forSection:(NSInteger)section {
//
// 这两个方法都不准确
//}
//
//- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
//
// 这两个方法都不准确
//}
//MARK: - 一个方法就能搞定 右边滑动时跟左边的联动
- (void)scrollViewDidScroll:(UIScrollView*)scrollView {
// 如果是 左侧的 tableView 直接return
if(scrollView ==self.leftTableView)return;
// 取出显示在 视图 且最靠上 的 cell 的 indexPath
NSIndexPath *topHeaderViewIndexpath = [[self.rightCollectionView indexPathsForVisibleItems] firstObject];
// 左侧 talbelView 移动的 indexPath
NSIndexPath*moveToIndexpath = [NSIndexPathindexPathForRow:topHeaderViewIndexpath.sectioninSection:0];
// 移动 左侧 tableView 到 指定 indexPath 居中显示
[self.leftTableView selectRowAtIndexPath:moveToIndexpath animated:YES scrollPosition:UITableViewScrollPositionMiddle];
}
//MARK: - 点击 cell 的代理方法
- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
// 选中 左侧 的 tableView
if(tableView ==self.leftTableView) {
NSIndexPath*moveToIndexPath = [NSIndexPath indexPathForItem:0 inSection:indexPath.item];
// NSIndexPath *moveToIndexPath = [NSIndexPath indexPathForRow:0 inSection:indexPath.row];
// 将右侧 tableView 移动到指定位置
[self.rightCollectionView selectItemAtIndexPath:moveToIndexPath animated:YES scrollPosition:(UICollectionViewScrollPositionTop)];
// [self.rightCollectionView selectRowAtIndexPath:moveToIndexPath animated:YES scrollPosition:UITableViewScrollPositionTop];
// 取消选中效果
[self.rightCollectionView deselectItemAtIndexPath:moveToIndexPath animated:YES];
}
}
-(UICollectionViewCell*)collectionView:(UICollectionView*)collectionView cellForItemAtIndexPath:(NSIndexPath*)indexPath{
TKYDataBankCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
cell.nameLabel.text= [NSStringstringWithFormat:@"区:%ld,行:%ld", indexPath.section,indexPath.item];
cell.backgroundColor = [UIColor yellowColor];
returncell;
}
// 设置每个分区返回多少item
-(NSInteger)collectionView:(UICollectionView*)collectionView numberOfItemsInSection:(NSInteger)section{
return 16;
}
// 设置集合视图有多少个分区
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView*)collectionView{
return 39;
}
/**
* 返回增补视图
*
* @paramcollectionView
* @paramkind
* @paramindexPath
*
* @return
*/
- (UICollectionReusableView*)collectionView:(UICollectionView*)collectionView viewForSupplementaryElementOfKind:(NSString*)kind atIndexPath:(NSIndexPath*)indexPath{
// 如果是头视图
if (kind == UICollectionElementKindSectionHeader) {
// 从重用池里面取
HeaderCollectionReusableView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerIdentifier forIndexPath:indexPath];
headerView.backgroundColor =[UIColor orangeColor];
// headerView.titleLabel.text = @"测试";
returnheaderView;
}else{
UICollectionReusableView *footerView = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:footerIdentifier forIndexPath:indexPath];
// footerView.backgroundColor = [UIColor brownColor];
// return footerView;
returnnil;
}
}
#pragma mark - 懒加载 tableView -
// MARK: - 左边的 tableView
- (UITableView*)leftTableView {
if (!_leftTableView) {
UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 84, leftTableWidth, ScreenHeight)];
[self.viewaddSubview:tableView];
_leftTableView= tableView;
tableView.dataSource=self;
tableView.delegate=self;
[tableViewregisterClass:[UITableViewCell class] forCellReuseIdentifier:leftCellIdentifier];
tableView.backgroundColor = [UIColor redColor];
tableView.tableFooterView = [[UIView alloc] init];
}
return _leftTableView;
}
- (void)initCollectionView{
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
flowLayout.itemSize = CGSizeMake((self.view.frame.size.width- leftTableWidth-3)/3, 50);
// 设置最小行间距
flowLayout.minimumLineSpacing=1;
// 最小列间距
flowLayout.minimumInteritemSpacing = 1;
flowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;
//flowLayout.sectionInset = UIEdgeInsetsMake(20, 20, 20, 20);
flowLayout.headerReferenceSize = CGSizeMake(self.view.frame.size.width, 30);
UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(leftTableWidth, 84, rightTableWidth, ScreenHeight) collectionViewLayout:flowLayout];
//设置属性
collectionView.delegate=self;
collectionView.dataSource=self;
// 是否显示垂直方向指示标, 继承于UIScrollView, 他的方法可以调用
collectionView.showsVerticalScrollIndicator = NO;
[collectionViewregisterClass:[TKYDataBankCell class] forCellWithReuseIdentifier:identifier];
/**
* 注册增补视图
*/
[collectionViewregisterClass:[HeaderCollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerIdentifier];
[collectionViewregisterClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:footerIdentifier];
self.rightCollectionView= collectionView;
[self.view addSubview:self.rightCollectionView];
}