UIScrollView中的跳跃性(当删除顶部'页面')

时间:2016-05-05 17:06:57

标签: ios swift uiscrollview

我正在构建一个自定义的原型UIScrollView,其核心功能是删除当前/最顶层的页面'一旦它通过顶视图边界(即完全不在视野范围内)。这已经在scrollView的委托中使用相当原始的代码工作得很好,但是从第二个页面继续滑动'向前导致一个小故障,scrollView很快就会跳转到下一页。这将一直持续到scrollView向相反方向移动。

我在我的图像阵列中使用了扑克牌图像作为页面,并且由于核心用户功能是要快速浏览这些卡片页面,因此出现故障是非常糟糕的用户体验/快速反应。

例如,请参阅以下视频:

(大约10秒 - 借口重播) enter image description here

我的代码是:

func scrollViewDidScroll(scrollView: UIScrollView) {

        if (scrollView.contentOffset.y >= scrollView.frame.height) {
            print("CATCH at \(scrollView.contentOffset.y)")

            // Handle 'cards' UIImageView array directly
            self.cards.first?.removeFromSuperview()
            self.cards.removeFirst()
            for cardImage in self.cards {
                cardImage.frame = CGRectOffset(cardImage.frame, 0, -cardImage.frame.height)
            }

            // Resize the scrollView's contentView and coordinates
            scrollView.contentSize = CGSizeMake(scrollView.frame.width, scrollView.contentSize.height - scrollView.frame.height)
            scrollView.setContentOffset(CGPointMake(0, 0), animated: false)

            print("new content offset: \(scrollView.contentOffset.y)")
        }
    }

在上面的代码中,当视图开始出现“故障”时(即滚动速度非常快),' CATCH' contentOffset.y的值超出了视图高度 - 当它是“平滑”时' CATCH' value正是页面高度(我们对正常分页动画的期望);因此,我只能假设它太迟了,因为它太快了(?)

通过先向相反方向移动scrollView来停止毛刺,建议在执行此操作时重置scrollView的动画或速度。

我在scrollViewDidEndDecelerating委托中尝试了很多不同的方法,例如重置scrollView' panGestureRecognizerscrollEnabled,但无效。

在这里感谢指点!

1 个答案:

答案 0 :(得分:0)

在尝试UIScrollViewDelegate的各种委托函数后,我发现在scrollView自然停止的位置处理scrollViewDidScroll(例如在分页的scrollView中下一页的结尾)在某些情况下(例如这个)绕过scrollViewDidEndDecelerating,并在滚动再次开始时导致错误触发,这就是导致页面跳跃的原因。

解决方案是将我的代码移至scrollViewDidEndDecelerating并仅在scrollViewDidScroll处理“实时”滚动事件编辑。