コアアニメーションを使用する場合を除き、グリッドスタイルビュー(NSCollectionView
に似ています)を作成しようとしています。私はかなり遠いですし、最後に残された主なことはスクロールを実装することです。CALayerでNSScrollViewを使用する
これまでの設定では、NSView
サブクラス(レイヤーバックアップ)があり、初期化すると、グリッドレイヤーを作成してメインビューレイヤのサブレイヤとして追加します。サブビューをグリッド状に整列させるグリッドレイヤーのカスタムCALayoutManager
を作成しました。予想どおり、グリッドレイヤにサブレイヤを追加すると、レイアウトマネージャが呼び出され、レイヤが自動的に配置されます。これまでは、すべてが正常に動作しています。
NSScrollView
をカスタムビューの親として使用してスクロールを実装しようとすると問題が発生します。私はこれを次のように設定しました:Interface BuilderのNSScrollView
のサブビューとしてカスタムビューを作成しました。次に、私のレイアウトマネージャクラスで、delegate
プロパティを追加し、初期化時にビューのサブクラスがレイアウトマネージャのデリゲートとして設定されます。レイアウトマネージャのlayoutSublayersForLayer:
メソッドの最後に、デリゲートメソッドlayoutManager:contentHeightChanged:
を使用してデリゲートを呼び出します。ここでは、そのメソッドの実装は私のNSView
サブクラスである:
- (void)layoutManager:(MyLayoutManager*)manager contentHeightChanged:(CGFloat)height;
{
CGFloat newHeight = [[self enclosingScrollView] contentSize].height;
if (height > newHeight) {
newHeight = height;
}
NSRect newFrame = [self frame];
newFrame.size.height = newHeight;
[self setFrame:newFrame];
}
それはちょうど新しい高さは、スクロールビューのコンテンツサイズより大きいかどうかをチェックし、非常に簡単だし、との意見枠を設定し、新しい高さ
これは、ある程度まで機能します。ビューのサイズが変更されると、コンテンツの高さをカプセル化してスクロールバーを表示する必要があるため、ビューのフレームのサイズが適切に調整されます。問題:スクロールバーが表示された状態でビューのサイズが変更されているときに、グリッドレイヤーのサブレイヤーがジッターする。ここでは、問題を示すビデオだ:
あなたが見ることができるように、コンテンツの高さは、の範囲内に収まるときスクロールバーが、他の言葉で(表示されていない何も問題はありませんスクロールビュー)。私は、スクロール・ビューなしで同じことをテストしたので、レイアウト・マネージャーと単一の列を扱うことに問題がないことを確認できます。
アドバイスをいただければ幸いです。
実際に行った例を挙げてください。 –