3

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

顺便说一下,我的意思不是性能方面的,我的意思是视图减速非常快,使得遍历变得困难。

它只是 UIScrollView 的子类,pagingEnabled设置为YES. 我能做些什么?

4

4 回答 4

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

最后,当动画滚动完成时,scrollViewDidEndScrollingAnimation:调用委托方法,此时pagingEnabled将设置回YES.

如果您发现无法让它识别“快速”滑动,请尝试使用该kCPPickerDecelerationThreshold值。事后看来,这可能应该是一个可定制的属性,所以也许我会把它放到下一次更新中。

于 2014-01-13T00:06:07.747 回答
0

Don't fill CPPickerView with all data. For example fill with first 20 items and if it reaches to the end add another 20.

于 2013-04-16T00:19:52.353 回答
0

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

于 2013-04-16T00:13:02.853 回答
0

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

scrollView.decelerationRate = UIScrollViewDecelerationRateNormal;

如果那仍然不能解决您的问题,您还可以将输入缓冲到滚动中。看到这个: 高级滚动视图技术

于 2013-04-18T22:33:36.907 回答