3

NSCollectionViewコア アニメーションを使用する以外は、グリッド スタイル ビュー (に類似) を作成しようとしています。私はそれをかなりやり遂げました。最後にやるべきことは、スクロールを実装することです。

これまでのセットアップでは、NSViewサブクラス (レイヤーがサポートされている) があり、初期化時にグリッド レイヤーを作成し、メイン ビュー レイヤーのサブレイヤーとして追加します。CALayoutManagerサブビューをグリッド状に配置するグリッド レイヤーのカスタムを作成しました。予想どおり、グリッド レイヤーにサブレイヤーを追加すると、レイアウト マネージャーが呼び出され、レイヤーが自動的に配置されます。この時点まで、すべてが正常に機能しています。

NSScrollViewカスタム ビューの親としてを使用してスクロールを実装しようとすると、問題が発生します。これを次のように設定しました: NSScrollViewInterface 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];
}

新しい高さがスクロール ビューのコンテンツ サイズよりも大きいかどうかを確認し、新しい高さでビュー フレームを設定するだけです。

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

http://vimeo.com/16987653

ご覧のとおり、スクロールバーが表示されていない場合 (つまり、コンテンツの高さがスクロール ビューの境界内に収まっている場合) は問題ありません。スクロール ビューを使用せずに同じことをテストしたところ、ジッターがないため、これがレイアウト マネージャーと単一列の処理に問題がないことを確認できます。

どんなアドバイスでも大歓迎です。

4

1 に答える 1

1

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

于 2010-11-19T23:48:38.640 に答える