NSCollectionView
コア アニメーションを使用する以外は、グリッド スタイル ビュー (に類似) を作成しようとしています。私はそれをかなりやり遂げました。最後にやるべきことは、スクロールを実装することです。
これまでのセットアップでは、NSView
サブクラス (レイヤーがサポートされている) があり、初期化時にグリッド レイヤーを作成し、メイン ビュー レイヤーのサブレイヤーとして追加します。CALayoutManager
サブビューをグリッド状に配置するグリッド レイヤーのカスタムを作成しました。予想どおり、グリッド レイヤーにサブレイヤーを追加すると、レイアウト マネージャーが呼び出され、レイヤーが自動的に配置されます。この時点まで、すべてが正常に機能しています。
NSScrollView
カスタム ビューの親としてを使用してスクロールを実装しようとすると、問題が発生します。これを次のように設定しました: NSScrollView
Interface Builder のサブビューとしてカスタム ビューを作成しました。次に、レイアウト マネージャー クラスにdelegate
プロパティを追加し、初期化中に、ビュー サブクラス自体をレイアウト マネージャーのデリゲートとして設定します。レイアウト マネージャーのメソッドの最後でlayoutSublayersForLayer:
、delegate メソッドを使用してそのデリゲートを呼び出します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];
}
新しい高さがスクロール ビューのコンテンツ サイズよりも大きいかどうかを確認し、新しい高さでビュー フレームを設定するだけです。
これはある程度機能します。ビューのサイズが変更されると、ビューのフレームがコンテンツの高さ全体をカプセル化するように適切にサイズ変更され、スクロールバーが表示されます。問題: スクロールバーが表示された状態でビューのサイズを変更すると、グリッド レイヤーのサブレイヤーがジッターします。問題を示すビデオは次のとおりです。
ご覧のとおり、スクロールバーが表示されていない場合 (つまり、コンテンツの高さがスクロール ビューの境界内に収まっている場合) は問題ありません。スクロール ビューを使用せずに同じことをテストしたところ、ジッターがないため、これがレイアウト マネージャーと単一列の処理に問題がないことを確認できます。
どんなアドバイスでも大歓迎です。