ここで 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
値をいじってみてください。後から考えると、おそらくカスタマイズ可能なプロパティである必要があるため、おそらく次の更新にそれをロールバックします.