2010-11-19 13 views
3

コアアニメーションを使用する場合を除き、グリッドスタイルビュー(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]; 
} 

それはちょうど新しい高さは、スクロールビューのコンテンツサイズより大きいかどうかをチェックし、非常に簡単だし、との意見枠を設定し、新しい高さ

これは、ある程度まで機能します。ビューのサイズが変更されると、コンテンツの高さをカプセル化してスクロールバーを表示する必要があるため、ビューのフレームのサイズが適切に調整されます。問題:スクロールバーが表示された状態でビューのサイズが変更されているときに、グリッドレイヤーのサブレイヤーがジッターする。ここでは、問題を示すビデオだ:

http://vimeo.com/16987653

あなたが見ることができるように、コンテンツの高さは、の範囲内に収まるときスクロールバーが、他の言葉で(表示されていない何も問題はありませんスクロールビュー)。私は、スクロール・ビューなしで同じことをテストしたので、レイアウト・マネージャーと単一の列を扱うことに問題がないことを確認できます。

アドバイスをいただければ幸いです。

答えて

1

レイヤーとビューの座標系(左上隅の原点)を反転することでこの問題を解決しました。

+8

実際に行った例を挙げてください。 –

関連する問題