3

アプリでCPPickerViewを使用して水平UIPickerViewを実現していますが、うまく機能しますが、大きなデータソース(数十のアイテム)ではスクロールが非常に遅く、前にナビゲーションが行われます(特に、通常のUIPickerViewがそれらを非常に速く通過できることを考慮してください) .

ところで、パフォーマンスの観点からではなく、ビューが非常に急速に減速し、トラバーサルが困難になるという意味です。

pagingEnabledに設定されたUIScrollView の単なるサブクラスですYES。私に何ができる?

4

4 に答える 4

0

ここで CPPickerView の作成者 - 私は最近 CPPickerView を更新してallowSlowDecelerationプロパティを追加しました。Github または Cocoapods バージョン 1.2.0 で最新のコードを確認してください。

ドキュメントの目的で、ソリューションのしくみを次に示します。あなたが言及したように、 CPPickerView は にpagingEnabled設定された単なるスクロールビューYESなので、私が見つけた解決策は、ユーザーが十分な速度でスクロールしたときにページングを無効にすることでした。

UIScrollViewDelegateオプションのメソッドscrollViewWillEndDragging:withVelocity:targetContentOffset:があり、スクロールビューでスワイプ/スクロールした後にユーザーの指が離されたときに呼び出され、ページングが有効になっている場合でも呼び出されます。その値に基づいて、ユーザーがアイテムをすばやくスクロールしようとしたのか、1 つまたは 2 つのアイテムを移動しようとしたのかがわかります。

Demo プロジェクトで CPPickerViews をいじってみたところ、約 の速度が2.9f通常の「高速スワイプ」のしきい値に近いように見えることがわかりました。そのため、速度がこのしきい値 ( で定義したもの) よりも大きく、 にkCPPickerDecelerationThreshold設定CPPickerView.mallowSlowDecelerationれているYES場合、CPPickerViewは減速が始まる前に に設定pagingEnabledされます。NOこれにより、ピッカーは通常のスクロールビューのように「惰走」して減速することができます。

scrollViewDidEndDecelerating:次に、デリゲート メソッドの呼び出しによって、減速の終了、またはユーザーがタッチしてスクロールを停止したことをキャッチします。現在の項目が (スクロールビューのオフセットに基づいて) 決定され、次にスクロールビューのpagingEnabledプロパティが に設定されている場合、アニメーションが に設定されNOたプライベート メソッドの呼び出しscrollToIndex:animated:が行われYESます。これは、CPPickerView を現在の項目までスクロールします。これは、コースティング スクロールがページ境界で終了する可能性が低いため必要です。

最後に、アニメーション化されたスクロールが完了すると、scrollViewDidEndScrollingAnimation:delegate メソッドが呼び出され、その時点pagingEnabledで が に戻されYESます。

「速い」スワイプを認識するのに問題がある場合は、kCPPickerDecelerationThreshold値をいじってみてください。後から考えると、おそらくカスタマイズ可能なプロパティである必要があるため、おそらく次の更新にそれをロールバックします.

于 2014-01-13T00:06:07.747 に答える
0

ソースを調べたところ、CPPickerView がスクロール ビューを使用しているようです。スクロール ビューにはdecelerationRateプロパティがあります。それを試して、どの値が最良の結果をもたらすかを確認してください。

于 2013-04-16T00:13:02.853 に答える
0

上記のように、decelerationRateプロパティを使用できます。設定するとUIScrollViewDecelerationRateNormal役立つ場合があります。

scrollView.decelerationRate = UIScrollViewDecelerationRateNormal;

それでも問題が解決しない場合は、入力をスクロールにバッファリングすることもできます。これを参照してください: 高度なスクロールビュー技術

于 2013-04-18T22:33:36.907 に答える