最近在实现一个需求,实现方案需要让UIScrollView支持单边回弹效果,也就是只有顶部支持下拉回弹,同时底部不能有回弹效果。 一开始我想的是在UIScrollViewDelegate的代理方法scrollViewDidScroll:中添加处理逻辑,当scrollView划到底部时就把回弹属性bounces设为NO,但实践发现效果不佳。


最后在stackoverflow.com找到一个不错的解决方法。这个方法比较简单而且效果完美。这里记录一下。 方法的思想就是当scrollView划到底部或者更往下时把scrollView的偏移量contentOffset设置到正好底部位置,用户是不会察觉到这个过程的。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.y + scrollView.frame.size.height >= scrollView.contentSize.height) {
        [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x, scrollView.contentSize.height - scrollView.frame.size.height)];
    }
}

设置其他三个边单边回弹的方法类似。