如图:当 cell 滚动到顶部的时候,改变这个 view 的 Y 值。
我首先想到是
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (scrollView.contentOffset.y <= 0)
{
CGPoint offset = scrollView.contentOffset;
offset.y = 0;
scrollView.contentOffset = offset;
}
}
但是问题来了,我把 contentOffset.y = 0 之后虽然到顶部没有弹簧效果了,但是。。。拿不到滚动的值了。
于是我想到添加手势,给 UITableView 添加手势,然后在滚动到顶部的时候,获取手指移动的偏移的位置, 但是效果很不理想,手势方法总被 cell 点击拦截。
请教如何做到图中这么丝滑的滚动!
1
rvw 2016-06-23 16:00:27 +08:00
网易的我看了到顶部也没有弹簧效果吧
|
2
finab 2016-06-23 16:12:28 +08:00
我正好实现了一个,给你整理下代码吧。主要是处理两个手势,将事件传递
|
3
finab 2016-06-23 16:28:13 +08:00
首先你要有一个 pan 手势,作用是将这个 UITableView 拖下去(将 UITableView 滚动禁用 测试这个手势工作正常)
然后你需要继承一个 UITableView ,重写里面的 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer; 方法 这个方法作用是系统询问两个手势是否同时接收消息 , gestureRecognizer 就是你这个 UITableView 的滑动手势(如果有其他手势,记得判断) otherGestureRecognizer 是其他手势,(一般来讲 当你这个 UITableView 不能接受手势时,能响应的手势。可能会有很多,所以你得判断哪个手势是你之前定义的移动 UITableView 的手势) 在方法内判断 self.contentOffset.y<=0 ,并且 otherGestureRecognizer 是你移动 UITableView 的那个手势。则 return YES 。让两个手势同时起作用 至于弹性效果,则你自己处理下就行 |
4
EPCoo OP |
5
finab 2016-06-23 16:35:48 +08:00
@EPCoo 你可以去专门学习下 iOS 的手势传递机制,最好能明白你自己的 UI 上所有手势的传递
手势是有一套固定逻辑处理的,不是玄学。你只要懂它的运行机制,就能随意掌控它。 上面我说的肯定能实现你这个功能, pan 手势在你滑动 UITableView 的时候,是一定会触发的,它的作用就是让 UITableView 能滑动,是 UIScrollView 的一个手势。所以你这个需求,其实是没 cell 什么事的。你可能 pan 加的位置不对 |
6
EPCoo OP @finab 我刚才是这么做的,继承 UITableView , 然后重写里面的 touch 方法, 然后在 外面的 View 里给 这个 tableview 添加一个 pan 手势,但是,就像我刚才说的事件传递会有问题。
刚看到你的回复。。。。 我去尝试一下你的方法!非常感谢! |
7
jackisnotspirate 2016-06-23 16:50:01 +08:00
用一个 container 把他们包起来,然后 hittest
|