3

観察

指を離した後、iOS 用の Objective-C で UITableViews / UIScrollViews がどのようにスクロールするかについて、いくつかの「奇妙な」ことを発見しました。

  • スクロール ビューの「速度」( のようにscrollViewWillEndDragging:withVelocity:targetContentOffset:) は、時間に基づいているのではなく、「レンダリング」や「フレームの更新」などに基づいています。つまり、「速度」が 3.0 の場合、次の更新の前にスクロール ビューが 3.0 ポイントスクロールし、その時点で「速度」がまだ 3.0 の場合はさらに 3.0 ポイントスクロールすることを意味します。(絶対的な時間ベースの速度とは対照的)

  • 「リフレッシュ」は約発生します。毎秒 950 回ですが、これはさまざまであり、信頼できません。(繰り返しますが、絶対時間ベースのリフレッシュ レートとは対照的です)

  • UIScrollViews は線形ではなく指数関数的に減速するため、decelerationRateは幾何学的定数です。これは、スクロール ビューが「更新」されるたびに、その「速度」が以前の速度に「減速率」を掛けた値に設定されることを意味します。

  • ある時点で、スクロール ビューの速度がゼロに近くなり、スクロールが停止します。このしきい値が何なのかはまだわかりません。


望ましい動作/問題

減速率を調整するために理論的に解くことができる方程式を導出しました。これにより、スクロール ビューが勢いをつけて自然にスクロールし、「ページング」を模倣するのに十分なテーブル ビュー セルの上部に落ち着くことができます。(コンテンツ オフセットを最小限に調整するためのアニメーションも追加しましたscrollViewDidEndDragging:willDecelerate:。decelerationRate を調整せずにコンテンツ オフセットを調整すると、奇妙に見えます。スクロール ビューが前方にジャンプするか、突然後方に飛び出します。)

この方程式は次のとおりです。 A d^n + B d + C = 0ここで、d = decelerationRate. 理想的には、d(n, A, B, C)の形式が欲しいのですが、数学博士の友人は、それは決定論的に可能ではないと言っています。彼は次のページを教えてくれました: http://en.wikipedia.org/wiki/Root-finding_algorithm

パラメータを取らないため、UIViewAnimationCurveEaseOutアニメーションスタイルを使用してスクロール ビューを所定のコンテンツ オフセットにアニメーション化できないこともわかりました。そうしないと、事前に計算されたコンテンツ オフセットまでスクロールを「偽装」します。setContentOffset:animated:options:

(SOでこれを見つけましたが、うまくいきませんでした: UIScrollview setContentOffset with nonlinear animation ? )

スクロール ビューのすべての要素が本質的にセルになるため、テーブル ビューを使用したいと思います。テーブル ビューはセルのリストを表示するのに最適です。ただし、目的の動作を取得するのが難しいことに基づいて、ページングスクロールビューを作成するだけで、おそらく簡単になります。次に、カスタムの「テーブル ビュー」に表示される「セル」の数を制限するか、必要に応じて事後的にロードすることができます。


あなたのアイデア/考え/提案は何ですか?

これまでのところ、私が望むものの既存の例は見つかりませんでした。


例 1また 例 2

4

1 に答える 1

4

したがって、この回答は、#iphonedev IRC チャンネルの意地悪だが優秀なユーザーから得られたものです。

内部からscrollViewWillEndDragging:withVelocity:targetContentOffset:、 targetContentOffset を*targetContentOffset = newTargetOffset;!経由で必要なものに再設定できます。信じられないほどシンプルでエレガント。

私の間違いは、まったく機能しなかった[scrollview setContentOffset:newTargetOffset animated:YES]内から呼び出そうとしたことでした.scrollViewWillEndDragging:withVelocity:targetContentOffset:

于 2013-04-29T20:08:47.793 に答える