使用大型数据源使CPPickerView滚动更快

时间:2013-04-08 21:45:45

标签: ios objective-c uiscrollview uipickerview

我在我的应用程序中使用CPPickerView来完成水平的UIPickerView,它工作得很好,但是对于大型数据源(数十个项目),它滚动速度非常慢,这使得导航之前(特别是考虑到普通的UIPickerView)可以非常快速地完成它们。)

顺便说一句,我的意思并不是表现,我的意思是视图减速很快,使遍历变得困难。

它只是UIScrollView的一个子类,pagingEnabled设置为YES。我该怎么办?

4 个答案:

答案 0 :(得分:0)

我查看了源代码,似乎CPPickerView正在使用滚动视图。滚动视图具有decelerationRate属性。玩这个,看看哪个值可以获得最佳效果。

答案 1 :(得分:0)

不要用所有数据填充CPPickerView。 例如,填充前20个项目,如果到达最后再添加20个项目。

答案 2 :(得分:0)

如上所述,您可以使用decelerationRate属性,将其设置为UIScrollViewDecelerationRateNormal可能有所帮助。

scrollView.decelerationRate = UIScrollViewDecelerationRateNormal;

如果仍然无法解决您的问题,您还可以将输入缓冲到滚动中。看到这个: Advanced scrollview techniques

答案 3 :(得分:0)

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:委托方法捕获减速结束,或者用户触摸以停止滚动。确定当前项(基于scrollview的偏移量),然后如果scrollview的pagingEnabled属性设置为NO,则使用动画集调用私有方法scrollToIndex:animated:YES。这会将CPPickerView滚动到当前项目,这是必要的,因为滑行滚动不太可能在页面边界上结束。

最后,当动画滚动完成后,系统会调用scrollViewDidEndScrollingAnimation:委托方法,此时pagingEnabled会重新设置为YES

如果您发现在识别“快速”滑动时遇到问题,请尝试使用kCPPickerDecelerationThreshold值进行游戏。事后看来,也许应该是一个可自定义的属性,所以也许我会把它推到下一个更新。