我在我的应用程序中使用CPPickerView来完成水平 UIPickerView,它工作得很好,但是对于大型数据源(数十个项目),它滚动非常缓慢,这使得导航之前(特别是考虑到普通的 UIPickerView 可以非常快速地通过它们) .
顺便说一下,我的意思不是性能方面的,我的意思是视图减速非常快,使得遍历变得困难。
它只是 UIScrollView 的子类,pagingEnabled
设置为YES
. 我能做些什么?
我在我的应用程序中使用CPPickerView来完成水平 UIPickerView,它工作得很好,但是对于大型数据源(数十个项目),它滚动非常缓慢,这使得导航之前(特别是考虑到普通的 UIPickerView 可以非常快速地通过它们) .
顺便说一下,我的意思不是性能方面的,我的意思是视图减速非常快,使得遍历变得困难。
它只是 UIScrollView 的子类,pagingEnabled
设置为YES
. 我能做些什么?
CPPickerView 的创建者在这里 - 我最近更新了 CPPickerView 以添加一个allowSlowDeceleration
属性,它应该可以满足您的需求。查看 Github 上的最新代码,或 Cocoapods 版本 1.2.0。
出于文档的目的,以下是解决方案的工作原理。就像您提到的 CPPickerView 只是一个pagingEnabled
设置为的滚动视图YES
,所以我找到的解决方案是在用户以足够的速度滚动时禁用分页。
UIScrollViewDelegate
有一个可选方法scrollViewWillEndDragging:withVelocity:targetContentOffset:
,当用户在滚动视图上滑动/滚动后抬起手指时调用该方法,即使启用了分页,它仍然会调用。根据该值,您可以判断用户是试图快速滚动浏览项目,还是只是移动一两个项目。
我在演示项目中使用了 CPPickerViews,发现大约的速度2.9f
似乎大约是正常的“快速滑动”阈值。因此,如果速度大于此阈值(我kCPPickerDecelerationThreshold
在 中定义CPPickerView.m
)并allowSlowDeceleration
设置为YES
,CPPickerView 现在会在减速开始之前设置pagingEnabled
为。NO
这允许选择器像普通滚动视图一样“滑行”和减速。
scrollViewDidEndDecelerating:
然后它通过调用委托方法来捕捉减速的结束,或者用户触摸停止滚动。当前项目被确定(基于滚动视图的偏移量),然后如果滚动视图的pagingEnabled
属性设置为NO
调用私有方法scrollToIndex:animated:
,动画设置为YES
. 这会将 CPPickerView 滚动到当前项目,这是必要的,因为滑行滚动不太可能在页面边界上结束。
最后,当动画滚动完成时,scrollViewDidEndScrollingAnimation:
调用委托方法,此时pagingEnabled
将设置回YES
.
如果您发现无法让它识别“快速”滑动,请尝试使用该kCPPickerDecelerationThreshold
值。事后看来,这可能应该是一个可定制的属性,所以也许我会把它放到下一次更新中。
Don't fill CPPickerView with all data. For example fill with first 20 items and if it reaches to the end add another 20.
我查看了源代码,似乎 CPPickerView 正在使用滚动视图。滚动视图有一个decelerationRate
属性。玩这个,看看哪个值可以获得最佳结果。
如上所述,您可以使用该decelerationRate
属性,将其设置为UIScrollViewDecelerationRateNormal
可能会有所帮助。
scrollView.decelerationRate = UIScrollViewDecelerationRateNormal;
如果那仍然不能解决您的问题,您还可以将输入缓冲到滚动中。看到这个: 高级滚动视图技术