0
点赞
收藏
分享

微信扫一扫

如何实现外卖选餐时两级tableView联动效果!!!

认真的老去 2021-09-29 阅读 50

怎样实现饿了么中选餐时两级tableView联动效果?

先上效果图让大家感受一下:

联动效果

具体实现步骤:

利用这两个方法就可以拿到当前所在分区实现这个功能了。

但是我总觉得这个方法不好,还有个更简单的方法,其实tableView有个极不常用,但很牛X的方法,叫做indexPathsForVisibleRows,官方文档解释是:

The value of this property is an array of NSIndexPath objects each representing a row index and section index that together identify a visible row in the table view. If no rows are visible, the value is nil.

简单意思就是,它返回一个装着目前屏幕上可见的cell的indexPath集合。

好的,重点来了,拿到这个集合,不就能拿到目前屏幕上顶端的cell的indexpath了吗,那就如愿以偿的拿到现在所在第indexpath.section个分区了。

说了这么多,上代码:

#pragma mark - UIScrollViewDelegate-(void)scrollViewDidScroll:(UIScrollView*)scrollView{// 监听tableView滑动// 如果现在滑动的是左边的tableView,不做任何处理if((UITableView*)scrollView ==self.leftTableView)return;// 滚动右边tableView,设置选中左边的tableView某一行。indexPathsForVisibleRows属性返回屏幕上可见的cell的indexPath数组,利用这个属性就可以找到目前所在的分区[self.leftTableView selectRowAtIndexPath:[NSIndexPathindexPathForRow:self.rightTableView.indexPathsForVisibleRows.firstObject.section inSection:0] animated:YESscrollPosition:UITableViewScrollPositionMiddle];}

稍微解释一下,首先监听scrollView的拖动,本demo不处理左边tableView的滚动,所以if ((UITableView *)scrollView == self.leftTableView) return;

self.rightTableView.indexPathsForVisibleRows.firstObject.section这句是拿到当前屏幕上可见cell的第一行cell所在的分区,然后让左边的tableView选中第0分区(它只有一个分区)的这一行就OK了。

根据~.~亲测,拖拽之后,这个方法调用与否在于你的手指是否在动画停止之前离开了屏幕,如果在动画结束之前手指离开屏幕,此方法调用没什么问题。but,如果动画已经停止,再把手指拿开,这个方法是不会调的。有图有真相:

WZBLinkageTableViewGif.gif

解决这个bug的关键在于,让手指离开的时候手动调一次这个代理方法,那怎么才能知道手指什么时候离开呢?scrollView给我们了另一个代理方法:- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset这个方法在结束拖拽的时候调,正好解决了我们的问题:

- (void)scrollViewWillEndDragging:(UIScrollView*)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inoutCGPoint*)targetContentOffset{// 推拽将要结束的时候手动调一下这个方法[selfscrollViewDidEndDecelerating:scrollView];}

OK \(^o^)/~解决问题!



举报

相关推荐

0 条评论