我在我的应用程序中使用CPPickerView来完成水平的UIPickerView,它工作得很好,但是对于大型数据源(数十个项目),它滚动速度非常慢,这使得导航之前(特别是考虑到普通的UIPickerView)可以非常快速地完成它们。)
顺便说一句,我的意思并不是表现,我的意思是视图减速很快,使遍历变得困难。
它只是UIScrollView的一个子类,pagingEnabled
设置为YES
。我该怎么办?
答案 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
值进行游戏。事后看来,也许应该是一个可自定义的属性,所以也许我会把它推到下一个更新。