NSTableView に 2 種類のデータを表示しています。それらをタイプ A および B と呼びましょう。これは単一の列であり、各行はタイプ A または B のいずれかです。基本的にデータをフィルタリングして A タイプの行を表示する 3 つのボタンがあります。 Bタイプの列 / A&Bタイプの列。各行の高さは、テキストの量に応じて可変です。
フィルター ボタンが押されると、新しいデータ配列を読み込み、それを古い配列と比較して、アニメーションで削除または挿入する行の NSIndexSet を構築します。これまでのところすべて順調です。
課題は、行の削除または挿入は、表示されたままの「アンカー行」がないことを意味するため、視覚的にユーザーの方向感覚を失わせることです。
たとえば、A&B の両方のタイプのデータが表示され、7 行目から 12 行目までが現在テーブルビューに表示されています。フィルター ボタンを押してタイプ A のデータのみを表示すると、行 2/4/5 が削除されますが、スクロール位置が同じままであるため、最初に表示される行は行 10 になります。
送信データ配列と受信データ配列の両方に存在する最初の表示行の「アンカー行」を定義することで、このアンカー行を画面上の同じ位置に保つために適用する必要があるスクロール オフセットの量を計算できます。これは行アニメーションなしで完全に機能しますが、アニメーションを使用すると大きな問題になります。
NSTableView のスクロール位置をアニメーション化する直接的な方法がないため、NSClipView の scrollPoint をアニメーション化し (アニメーションが正確に同期しないため、アンカー行がジッターします)、NSClipView 境界の起点をアニメーション化してみました ( NSTableView との Core Animation の競合と思われる行がまったく描画されず、アニメーション中に適切に再描画されません)。
だから私の質問は、これを行うためのより簡単な方法 (NSTableView のサブクラス?) があるかどうか、または NSTableView を放棄して NSView サブビューでカスタム クラスを作成する必要があるかどうかです。