scrollViewDidEndDecelerating方法不执行解决方案

原创 2015年07月06日 22:28:34

如果是因为忘记指定代理这种低级错误导致的回调函数不执行,这里不进行任何讨论。

通常,我们希望在滑动结束后,执行一些代码。scrollViewDidEndDecelerating方法在一定程度上可以解决我们的需求。注意是一定程度上。

顾名思义,scrollViewDidEndDecelerating表示减速结束了。然而减速结束和滑动结束并不等价。因为有些滑动并不需要减速也可以结束。比如我两只手轮流向左滑动,直到滑动到scrollview的右侧尽头为止,这个过程的滑动是被迫终止而不是自然减速停止,所以scrollViewDidEndDecelerating方法是不会被执行的。

怎么解决这个bug呢?可以用到另一个方法:scrollViewDidEndDragging: willDecelerate:
这个方法的含义是拖动结束。也就是用户的手从屏幕上抬起的一刹那,会执行这个方法。

那把之前scrollViewDidEndDecelerating方法里的代码直接复制进这个方法,可以解决问题么?答案是不可以。因为这个方法只能获取到用户的手离开屏幕事件,而这与滑动结束往往还有一段时间的间隔。如果原代码涉及动画相关,用户体验将会非常糟糕。此外,不难得出结论:

scrollViewDidEndDragging一定在scrollViewDidEndDecelerating方法之前被执行,有时候要早得多(自然停止滑动),有时候几乎是同时的(被迫停止滑动)。

扯了这么多废话,正确的解决方案是是什么呢?参加以下代码:

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    if(!decelerate){
        //这里复制scrollViewDidEndDecelerating里的代码
    }
}

为什么要加一个判断呢,试想一下,什么情况可能出现用户停止滑动(手指离开屏幕)而且恰好不在减速呢?正是本文最初提出的那个反例:因为滑动到了边界而被迫终止滑动。

这恰好与scrollViewDidEndDecelerating方法的不足是互补的!

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

有关scrollViewDidEndDecelerating的一个小问题

这个函数会在scrollview停止滑动的时候执行,通常是先把某个UIScrollView的delegate设置为某个类,然后在这个类里写 -(void) scrollViewDidEndDecel...

IOS学习-区别scrollViewDidEndDragging和scrollViewDidEndDecelerating

两个都时滚动停后执行的scrollView代理方法,使用的有什么区别呢? // 触摸屏幕并拖拽画面,再松开,最后停止时,触发该函数 - (void)scrollViewDidEndDraggin...

scrollViewDidEndDragging和scrollViewDidEndDecelerating有什么区别呢

两个都时滚动停后执行的scrollView代理方法,使用的有什么区别呢? - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView wi...

IOS学习-区别scrollViewDidEndDragging和scrollViewDidEndDecelerating

两个都时滚动停后执行的scrollView代理方法,使用的有什么区别呢? // 触摸屏幕并拖拽画面,再松开,最后停止时,触发该函数 - (void)scrollViewDidEndDr...

scrollViewDidEndDecelerating

- (void) scrollViewDidScroll:(UIScrollView *)sender 上面这句在滑动scrollview的时候会执行多次 在调用这个方法进行处理的时候 发现容易卡...

tomcta启动时需要执行的方法--解决方案

最近在搞James邮件服务器和项目的整合,之前的做法是先启动项目在启动James,或者先启动james然后在启动项目,现在项目经理要求James和项目要同时启动,不需要在额外的启动了,项目启动了,Ja...

限制某方法执行时间的一个解决方案和实现

其实每个能够写代码的人都想完全掌握自己的代码的执行情况,但由于现在的高级语言封装的比较好,我们已经越来越难的控制一个程序的底层实现,更不用说完全掌控一个程序的执行时间了。所以我就一直在构思,能不能利用...

.net(c#)在循环语句中执行WebBrowser.Navigate();方法,每次循环等待网页加载完后继续执行的解决方案.(转载)

有蛮久没有更新了,我还是当初的程序员吗,呵呵http://www.cnblogs.com/yangxiaohu1/archive/2009/01/06/1370693.html .net(c#)在循环...

net(c#)在循环语句中执行WebBrowser.Navigate();方法,每次循环等待网页加载完后继续执行的解决方案

最近在写一个小程序的时候,遇到这样的需求:           已知一组网页url地址,想获取每一个网页的html,实际上就是想利用循环语句里面使用WebBrowser来加载每一个网页,然后获取他们...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)