最近公司APP更新版本鼻百,順帶更新了整個(gè)首頁(yè)的效果,花了幾天時(shí)間整理立莉,也看了網(wǎng)上很多“仿半糖首頁(yè)效果”的demo榨崩,但是發(fā)現(xiàn)有一個(gè)共同的問題是:用戶只能作用于tableview或者scrollview上才能滑動(dòng),如果頁(yè)面上布局的控件很多竖伯,導(dǎo)致下面能夠滑動(dòng)并且展示數(shù)據(jù)的tableview顯示在屏幕底部存哲,這樣對(duì)于用戶的體驗(yàn)性就很差,用戶只能手指移動(dòng)底部的tableview或者scrollview來(lái)使上面拍版的控件向上移動(dòng)七婴。下面說(shuō)說(shuō)我的做法:
下面是我構(gòu)建的一個(gè)布局
整個(gè)其實(shí)是個(gè)uitableview宏胯,其中把滾動(dòng)標(biāo)簽作為存放滾動(dòng)列表section的頭部視圖,除此之外另外的控件可以放倒tableview的別的section中本姥,主要的是存放滾動(dòng)切換列表section肩袍,必須是容器表格最后一個(gè)section。其實(shí)主要是cell里面嵌套scrollview婚惫,scrollview嵌套多個(gè)表格氛赐,這樣問題就來(lái)了,同向滑動(dòng)的時(shí)候先舷,我們?cè)趺粗阑瑒?dòng)的是哪個(gè)scrollview艰管。
那我們一步一步代碼解釋:
首先主視圖構(gòu)建一個(gè)tableview容器,不多說(shuō)大家都會(huì):
其中又一點(diǎn)蒋川,這個(gè)主容器tableview必須要支持多手勢(shì)牲芋,
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
構(gòu)建底部的滑動(dòng)表格
#import@interface tableviewViewController : UIViewController
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, assign) BOOL vcCanScroll;
@end
@implementation tableviewViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
_tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds)) style:UITableViewStylePlain];
_tableView.delegate = self;
_tableView.dataSource = self;
//? ? _tableView.bounces = NO;
[self.view addSubview:_tableView];
}
#pragma mark UITableView
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 20;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 80;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (!cell) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
cell.textLabel.text = [NSString stringWithFormat:@"%ld",indexPath.row];
return cell;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (!self.vcCanScroll) {
scrollView.contentOffset = CGPointZero;
}
if (scrollView.contentOffset.y <= 0) {
self.vcCanScroll = NO;
scrollView.contentOffset = CGPointZero;
[[NSNotificationCenter defaultCenter] postNotificationName:@"leaveTop" object:nil];//到頂通知父視圖改變狀態(tài)
}
self.tableView.showsVerticalScrollIndicator = _vcCanScroll?YES:NO;
}
其實(shí)主要一點(diǎn)是監(jiān)聽scrollview滑動(dòng)的位置。
在主視圖監(jiān)聽子tableview發(fā)送給俯視圖改變狀態(tài)的通知
[KNotificationCenter addObserver:self selector:@selector(getOffset) name:@"leaveTop" object:nil];
- (void)getOffset
{
self.canScroll = YES;
tableviewViewController *vc = (tableviewViewController *)[tableViewArray objectAtIndex:self.selectIndex];
vc.vcCanScroll = NO;
}
這里也是需要監(jiān)聽主scrollview的滑動(dòng)位置
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat bottomCellOffset = [mytableview rectForSection:1].origin.y;
if (scrollView.contentOffset.y >= bottomCellOffset) {
scrollView.contentOffset = CGPointMake(0, bottomCellOffset);
tableviewViewController *vc = (tableviewViewController *)[tableViewArray objectAtIndex:self.selectIndex];
if (self.canScroll) {
self.canScroll = NO;
vc.vcCanScroll = YES;
}
}else{
if (!self.canScroll) {//子視圖沒到頂部
scrollView.contentOffset = CGPointMake(0, bottomCellOffset);
}
mytableview.showsVerticalScrollIndicator = self.canScroll;
}
其實(shí)寫到這里了 主要功能就完成了 捺球。