ScrollView 滑动方法不执行解决方案

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

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

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

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

scrollViewDidEndDragging一定在scrollViewDidEndDecelerating方法之前被执行,有时候要早得多(自然停止滑动),有时候几乎是同时的(被迫停止滑动)。
扯了这么多废话,正确的解决方案是是什么呢?参加以下代码:

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

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

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


0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值