1.很久没写过博客了,最近项目要仿照微博个人主页和网易云音乐个人主页那样,多个UITableView共用一个tableHeaderView,可以左右切换不同tableView,也可以点击特定按钮切换不同的tableView
1.实现思路
在控制器中初始化一个UICollectionView,让其左右滑动,在当前控制器中添加三个其他控制器,把这三个控制器分别放在UICollectionViewCell中,这样滑动的时候就可以切换不同的控制器了,然后在其他控制器添加你需要的不同UITableView,这样耦合度就小了。
#pragma mark - UICollectionViewDataSource
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return [[self childViewControllers] count];
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifer forIndexPath:indexPath];
if (!cell) {
cell = [[UICollectionViewCell alloc] init];
}
[cell.contentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
ZDTableViewController *vc = self.childViewControllers[indexPath.row];
for (UIView *view in cell.contentView.subviews) {
[view removeFromSuperview];
}
[cell.contentView addSubview:vc.view];
return cell;
}
在UICollectionView所造的控制器顶部放一个headerView高度为200(具体高度可以自己定),每个UITableView设置它的tableHeaderView高度也为200。在UITableView滑动的时候改变headerView的位置,可以写一个父类UITableViewController控制器让三个控制器集成这个父类,父类控制器写一个代理来传递UITableVIew滑动的偏移量
UITableVIewController父类.h
#import@protocol ZDTableViewDelegate- (void)tableViewDidScroll:(UIScrollView *)scrollView;@end@interface ZDTableViewController : UITableViewController@property (nonatomic,weak)idscrollViewDelegate;
- (void)setContentOffset:(CGFloat)Offset withTag:(NSInteger)tag;
@end
父类.m
#import "ZDTableViewController.h"
@interface ZDTableViewController ()
@end
@implementation ZDTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
//每一个tableView头部初始化一个占位view
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, HEADERVIEW_HEIGHT)];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)setContentOffset:(CGFloat)Offset withTag:(NSInteger)tag{
}
#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if([self.scrollViewDelegate respondsToSelector:@selector(tableViewDidScroll:)])
{
[self.scrollViewDelegate tableViewDidScroll:scrollView];
}
}
@end
具体代码实现GitHub 代码下载链接
Swift版GitHub Swift版链接