我正在构建一个自定义的原型UIScrollView
,其核心功能是删除当前/最顶层的页面'一旦它通过顶视图边界(即完全不在视野范围内)。这已经在scrollView的委托中使用相当原始的代码工作得很好,但是从第二个页面继续滑动'向前导致一个小故障,scrollView很快就会跳转到下一页。这将一直持续到scrollView向相反方向移动。
我在我的图像阵列中使用了扑克牌图像作为页面,并且由于核心用户功能是要快速浏览这些卡片页面,因此出现故障是非常糟糕的用户体验/快速反应。
例如,请参阅以下视频:
我的代码是:
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' panGestureRecognizer
和scrollEnabled
,但无效。
在这里感谢指点!
答案 0 :(得分:0)
在尝试UIScrollViewDelegate
的各种委托函数后,我发现在scrollView自然停止的位置处理scrollViewDidScroll
(例如在分页的scrollView中下一页的结尾)在某些情况下(例如这个)绕过scrollViewDidEndDecelerating
,并在滚动再次开始时导致错误触发,这就是导致页面跳跃的原因。
解决方案是将我的代码移至scrollViewDidEndDecelerating
并仅在scrollViewDidScroll
处理“实时”滚动事件编辑。