在網(wǎng)上找了很多,沒(méi)有喜歡的方案亭饵。也參考了眾多設(shè)計(jì)翰舌,做了一款自認(rèn)為比較簡(jiǎn)潔、完美的方案:
大致思路:外層放置scrollview作為容器冬骚,容器內(nèi)上部分topView椅贱,下部分tableView。當(dāng)tableView滾動(dòng)時(shí)只冻,如果topView還在展示區(qū)域庇麦,就設(shè)置topView的y坐標(biāo),讓topView跟隨同步上移喜德。
(注意:如果不設(shè)置tableView的headerView山橄,tableView、和topView都會(huì)同時(shí)上移不是我想要的效果舍悯,所以設(shè)置tableView的headerView高度包括topView的高度航棱,達(dá)到了完美的效果,具體實(shí)現(xiàn)看demo)
效果預(yù)覽:
NestScrollView.gif
核心代碼就是在父視圖萌衬、子試圖的滾動(dòng)判斷
//父視圖滾動(dòng)的回調(diào)饮醇,用于橫向滾動(dòng)判斷
//父視圖滾動(dòng)的回調(diào),用于橫向滾動(dòng)判斷
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
CGFloat placeholderOffset = 0;
if (self.topView.selectedIndex == 0) {
if (self.firstTableView.contentOffset.y > CGRectGetHeight(self.topView.frame) - kItemheight) {
placeholderOffset = CGRectGetHeight(self.topView.frame) - kItemheight;
}else {
placeholderOffset = self.firstTableView.contentOffset.y;
}
[self.secondTableView setContentOffset:CGPointMake(0, placeholderOffset) animated:NO];
}else {
if (self.secondTableView.contentOffset.y > CGRectGetHeight(self.topView.frame) - kItemheight) {
placeholderOffset = CGRectGetHeight(self.topView.frame) - kItemheight;
}else {
placeholderOffset = self.secondTableView.contentOffset.y;
}
[self.firstTableView setContentOffset:CGPointMake(0, placeholderOffset) animated:NO];
}
}
//子視圖滾動(dòng)的回調(diào)秕豫,用于豎直方向上滾動(dòng)判斷
//子視圖滾動(dòng)的回調(diào)朴艰,用于豎直方向上滾動(dòng)判斷
- (void)updateTopViewFrame:(UIScrollView *)scrollView{
CGFloat placeHolderHeight = CGRectGetHeight(self.topView.frame) - self.topView.itemHeight;
CGFloat offsetY = scrollView.contentOffset.y;
CGFloat y = 0.0;
if (offsetY >= 0 && (offsetY <= placeHolderHeight)) {
y = -offsetY;
} else if (offsetY > placeHolderHeight) {
y = -placeHolderHeight;
} else if (offsetY < 0) {
y = -offsetY;
}
[self.topView mas_updateConstraints:^(MASConstraintMaker *make) {
make.top.offset(y + kNavBarHeight);
}];
}
githut demo下載地址:https://github.com/biyuhuaping/NestScrollView