2

NSWindows の動的なサイズ変更に関する質問に対する多くの回答を読みましたが、まだ何も機能していません。

メニューバーから表示される「ポップオーバー」のようなウィンドウを作成しましたが、デザインの点で十分にカスタマイズできないため、NSPopover を使用できませんでした。現在のビュー階層は次のようになります。

NSWindow Subclass
  - NSView (clears the titlebar rendering, draws popover arrow)
     - NSView (contentView)
        - NSOutlineView (main table of content)
        - NSView (window footer)

私が必要としているのは、ウィンドウが NSOutlineView の拡大および縮小の項目で拡大および縮小することです。これにより、ウィンドウは常に、アウトライン ビュー、フッター、および上部のポップオーバー矢印に対して正確な高さになります。

コンテンツに基づいてアウトライン ビューに必要な高さを計算する方法があります。これまでのところ、コンテンツ ビュー コントローラーで が呼び出されたときにサイズを再計算しようとしてから、デリゲート メソッドとでawakeFromNib再度サイズを再計算しようとしましたが、ウィンドウのサイズを正しく変更することはできません。outlineViewItemDidCollapse:outlineViewItemDidExpand:

私は多くの異なる方法を試しましたが、どれもうまくいきませんでした。これを行う「標準的な」方法はありますか?この種の問題に関連して人々が話しているのを見てきまし-[NSWindow frameForContentRect:]たが、それがどのように必要なのかがよくわかりません。

たぶん、私はこれを完全に間違った方法で行っているのかもしれませんが、そうでないことを願っています. これは可能であるように思われます。適切なものを適切な場所に配置するだけです。残念ながら、GUI プログラミングは私の得意分野ではありません。人々が持っているアイデアや解決策をいただければ幸いです。

ありがとう。

編集:これは、一部はマークされた回答が原因で、一部は他のいくつかの理由で解決されました。クリアする NSView には自動サイズ変更マスクがなかったので、これを全方向に拡張するように設定しました。これにより、サイズ変更の問題がいくつか解決しました。また、必要な高さを計算するために使用していた方法は完全に正しくなく、いくつかの問題がありました.

提供された回答では、必要な高さを見つける方法は状況によっては適切ですが、測定できる「ルート」アイテムがありませんでした。これは、考慮に入れる必要があるかもしれないものです。

4

2 に答える 2

2

これが私の方法です。これは非常にうまく機能しますが、おそらくそれよりも優れた方法があります。

- (void)outlineViewItemDidExpand:(NSNotification *)notification {
    [self resizeWindowHeight];
}
- (void)outlineViewItemDidCollapse:(NSNotification *)notification {
    [self resizeWindowHeight];
}
- (void)resizeWindowHeight {
    NSRect wRect = [myWindow frame];
    NSRect oRect = [myoutlineView rectOfRow:([myoutlineView numberOfRows] - 1)]; //get rect of last row
    CGFloat n = oRect.origin.y + oRect.size.height + 22;
    wRect.origin.y = wRect.origin.y + (wRect.size.height - n);
    wRect.size.height = n;
    [myWindow setFrame:wRect display:YES animate:YES];
}

数値22は、(上部ウィンドウ - 上部アウトライン) + アウトライン ヘッダーの高さ + 水平スクローラーの高さ + (下部ウィンドウ - 下部アウトライン) + ツールバーの高さの合計です。

この例のIBでの私の設定: 水平スクローラーもヘッダーもなし、アウトラインの高さ = ウィンドウの contentView の高さ、つまり 22 がウィンドウの境界線です。

ツールバーがある場合、または水平スクローラーが自動的に非表示になる場合は、コードに条件を追加して (ツールバーとスクローラー) の可視性を確認し、それに応じて高さを変更する必要があります。

于 2012-06-09T21:16:19.390 に答える
0

1 つの方法は、アウトライン ビューの初期の高さとウィンドウの初期の高さを記録し、アウトライン ビューの高さが変化するにつれて、ウィンドウの新しい高さ = 古い高さ + (新しいアウトラインの高さ - 古いアウトラインの高さ) を計算することです。初期状態からの変更点だけで作業することで、物事がより柔軟になります。物事のサイズをゼロから再計算する場合のように、レイアウト全体をコードで複製する必要はありません。IB を使用してウィンドウをレイアウトすることができ、コードが詳細を知らなくてもそのレイアウトを保持する必要があります。また、IB でレイアウトを更新しても、コードは引き続き機能します。

それ以外の場合は、試したことを示し、それが正しくないことを説明することをお勧めします。

于 2012-06-09T18:40:34.803 に答える