在網上找了很多,沒有喜歡的方案。也參考了眾多設計,做了一款自認為比較簡潔、完美的方案:
大致思路:外層放置scrollview作為容器,容器內上部分topView,下部分tableView。當tableView滾動時,如果topView還在展示區域,就設置topView的y坐標,讓topView跟隨同步上移。
(注意:如果不設置tableView的headerView,tableView、和topView都會同時上移不是我想要的效果,所以設置tableView的headerView高度包括topView的高度,達到了完美的效果,具體實現看demo)
效果預覽:
NestScrollView.gif
核心代碼就是在父視圖、子試圖的滾動判斷
//父視圖滾動的回調,用于橫向滾動判斷
//父視圖滾動的回調,用于橫向滾動判斷
- (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];
}
}
//子視圖滾動的回調,用于豎直方向上滾動判斷
//子視圖滾動的回調,用于豎直方向上滾動判斷
- (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