ここで CPPickerView の作成者 - 私は最近 CPPickerView を更新してallowSlowDecelerationプロパティを追加しました。Github または Cocoapods バージョン 1.2.0 で最新のコードを確認してください。
ドキュメントの目的で、ソリューションのしくみを次に示します。あなたが言及したように、 CPPickerView は にpagingEnabled設定された単なるスクロールビューYESなので、私が見つけた解決策は、ユーザーが十分な速度でスクロールしたときにページングを無効にすることでした。
UIScrollViewDelegateオプションのメソッドscrollViewWillEndDragging:withVelocity:targetContentOffset:があり、スクロールビューでスワイプ/スクロールした後にユーザーの指が離されたときに呼び出され、ページングが有効になっている場合でも呼び出されます。その値に基づいて、ユーザーがアイテムをすばやくスクロールしようとしたのか、1 つまたは 2 つのアイテムを移動しようとしたのかがわかります。
Demo プロジェクトで CPPickerViews をいじってみたところ、約 の速度が2.9f通常の「高速スワイプ」のしきい値に近いように見えることがわかりました。そのため、速度がこのしきい値 ( で定義したもの) よりも大きく、 にkCPPickerDecelerationThreshold設定CPPickerView.mさallowSlowDecelerationれているYES場合、CPPickerViewは減速が始まる前に に設定pagingEnabledされます。NOこれにより、ピッカーは通常のスクロールビューのように「惰走」して減速することができます。
scrollViewDidEndDecelerating:次に、デリゲート メソッドの呼び出しによって、減速の終了、またはユーザーがタッチしてスクロールを停止したことをキャッチします。現在の項目が (スクロールビューのオフセットに基づいて) 決定され、次にスクロールビューのpagingEnabledプロパティが に設定されている場合、アニメーションが に設定されNOたプライベート メソッドの呼び出しscrollToIndex:animated:が行われYESます。これは、CPPickerView を現在の項目までスクロールします。これは、コースティング スクロールがページ境界で終了する可能性が低いため必要です。
最後に、アニメーション化されたスクロールが完了すると、scrollViewDidEndScrollingAnimation:delegate メソッドが呼び出され、その時点pagingEnabledで が に戻されYESます。
「速い」スワイプを認識するのに問題がある場合は、kCPPickerDecelerationThreshold値をいじってみてください。後から考えると、おそらくカスタマイズ可能なプロパティである必要があるため、おそらく次の更新にそれをロールバックします.