最近一個項目涉及到類似于餓了么的點餐頁面,百度好久沒找到合適的Demo 只好動手寫一個。現(xiàn)在上代碼,感興趣的伙伴可以看一下,如出現(xiàn)BUG或有更好的建議歡迎提給我:1614056471
1.先說下點餐頁的難點:理清“主tableview”什么時候不能往上滑 什么時候不能往下滑 ?主tableview cell里面嵌套的tableView什么時候不能往下滑 什么時候不能往上滑 只要將上滑、下滑的限制條件理清,整個點餐功能就不難做了
2.先看一下demo的整體結(jié)構(gòu):整個點餐功能分成了三個控制器(為了方便管理tableView代理)“點菜”的相關(guān)功能實現(xiàn)全部放到了“點餐控制器”,“商家”的相關(guān)功能實現(xiàn)全部放到了“商家控制器” ?“主控制器”對另外兩個字控制器進行管理。
3.主控制器(ELeMeOrderPageViewMainController)里面的關(guān)鍵代碼:/**
UIScrollViewDelegate
*/
- (void)scrollViewDidScroll:(UIScrollView*)scrollView {
if([scrollViewisEqual:self.mainTableView]) {
//
//NSLog(@"%lf, %lf", scrollView.contentOffset.y, scrollView.contentSize.height-scrollView.bounds.size.height);
if(scrollView.contentOffset.y>= (scrollView.contentSize.height-scrollView.bounds.size.height-0.5)) {//mainTableView滾動不能超過最大值
self.offsetType=OffsetTypeMax;
scrollView.contentOffset=CGPointMake(scrollView.contentOffset.x, scrollView.contentSize.height-scrollView.bounds.size.height);//(scrollView.contentSize.height-scrollView.bounds.size.height):mainTableView可以滾動的最大偏移距離超過等于最大偏移距離不可以再向上滑動
_mainTableViewOldOffSet= scrollView.contentSize.height-scrollView.bounds.size.height;
}elseif(scrollView.contentOffset.y<=0) {
self.offsetType=OffsetTypeMin;
}else{
self.offsetType=OffsetTypeCenter;
}
if((self.levelListView.selectedIndex==0&&self.subLeftVC.offsetType!=OffsetTypeMin)&&(self.subLeftVC.rightTVScrollDown||(scrollView.contentOffset.y-_mainTableViewOldOffSet<0))) {//self.subLeftVC.offsetType != OffsetTypeMin時_mainTableView不能向下滑動(注釋:當點菜頁面顯示并且商品列表tableView未達到最大偏移量之前,mainTableView不能向下滑動)
scrollView.contentOffset=CGPointMake(scrollView.contentOffset.x,_mainTableViewOldOffSet);
}
if(self.levelListView.selectedIndex==1&&self.subRightVC.offsetType!=OffsetTypeMin) {//當商家頁面顯示時,商家信息tableview偏移量不是最小狀態(tài)說明mainTableView已經(jīng)滾動到了最大值在商家信息tableview偏移量未達到最小偏移量之前mainTableView需要保持原來的偏移量不變
scrollView.contentOffset=CGPointMake(scrollView.contentOffset.x,_mainTableViewOldOffSet);
}
_mainTableViewOldOffSet= scrollView.contentOffset.y;
}
if([scrollViewisEqual:self.subScrollView]) {
[self.levelListViewchangeLineViewOffsetX:self.subScrollView.contentOffset.x];
}
}
4.點餐控制器(ELeMeOrderPageLeftViewController)關(guān)鍵代碼:
#pragma mark --- UIScrollViewDelegate ---
- (void)scrollViewDidScroll:(UIScrollView*)scrollView {
ELeMeOrderPageViewMainController*vc = (ELeMeOrderPageViewMainController*)[selfparentViewController];//父控制器
NSLog(@"aaaaaaaaaaaaaa=====%f",scrollView.contentOffset.y);
if(scrollView==self.rightTableView&&!_didSelectLeftTVCell) {
if(scrollView.contentOffset.y<=0) {//rightTableView不能小于最小值(不能下滑的條件)
self.offsetType=OffsetTypeMin;
scrollView.contentOffset=CGPointZero;
}else{
self.offsetType=OffsetTypeCenter;
}
//聯(lián)動邏輯:rightTableViews頂部section頭消失出現(xiàn)實現(xiàn)leftTableView選擇聯(lián)動
if(scrollView.contentOffset.y>_oldRightOffsetY) {
_rightTVScrollUp=YES;
_rightTVScrollDown=!_rightTVScrollUp;
}elseif(scrollView.contentOffset.y<_oldRightOffsetY)
{
_rightTVScrollUp=NO;
_rightTVScrollDown=!_rightTVScrollUp;
}
if(vc.offsetType!=OffsetTypeMax&&_rightTVScrollUp) {//vc.offsetType!= OffsetTypeMax時rightTableView不能向上滑動(不能上滑的條件)
scrollView.contentOffset=CGPointMake(0,_oldRightOffsetY);
}
if(vc.offsetType==OffsetTypeMax) {
}
NSLog(@"ccccccccccc=====%f",scrollView.contentOffset.y);
_oldRightOffsetY=floorf(scrollView.contentOffset.y);
}
}
5.商家控制器里的關(guān)鍵代碼與上面類似,不再累述,實現(xiàn)滑動效果還有一個重要的點:當滑動作用到商品列表tableView或商家信息tableview上時,主控控制器主tableview也必須能響應(yīng)滑動,因此繼承商品列表tableView 與商家信息tableview 都繼承了LWGesturePenetrationTableView,LWGesturePenetrationTableView:里實現(xiàn)的方法#pragma mark --- other ---
- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(nonnullUIGestureRecognizer*)otherGestureRecognizer
{
returnYES;
}
6.這是我目前想到的實現(xiàn)方法,要是有更好的實現(xiàn)歡迎分享,具體實現(xiàn)下載demo吧,純原創(chuàng) 希望在git上給顆星。