10

ウィンドウを画面に配置する際に奇妙な問題があります。ウィンドウを画面の中央に配置したいのですが、やり方がわかりません。これが私が持っているものです。ウィンドウは、メイン コントローラーによって nib から作成されます。

IdentFormController *ftf = [[IdentFormController alloc] initWithWindowNibName:@"IdentForm"];
[[ftf window] makeKeyAndOrderFront:self];

現在、IdentFormController には、ウィンドウの配置を試みる awakeFromNib() メソッドがあります。簡単にするために、setFrameOrigin(NSMakePoint(0, 0)) を実行しようとしました。何が起こるかは次のとおりです。

このウィンドウを初めて作成すると、すべてが期待どおりに機能します。しかし、以前のものをリリースした後に再度作成すると、ランダムな位置に表示され始めます。なぜそれをするのですか?

4

4 に答える 4

14

私が理解しているように、ウィンドウを画面の中央に配置したいですか?

あなたのウィンドウオブジェクトだNSWindow *windowとすると、2つの方法があります...

[window center];

これが最善の方法ですが、見た目の重みと Dock の存在を考慮して調整します。

デッドセンターが必要な場合は、これでうまくいきます...

// Calculate the actual center
CGFloat x = (window.screen.frame.size.width - window.frame.size.width) / 2;
CGFloat y = (window.screen.frame.size.height - window.frame.size.height) / 2;

// Create a rect to send to the window
NSRect newFrame = NSMakeRect(x, y, window.frame.size.width, window.frame.size.height);

// Send message to the window to resize/relocate
[window setFrame:newFrame display:YES animate:NO];

このコードはテストされていませんが、このことを希望どおりに機能させるために何をする必要があるかについてのかなりのアイデアを提供します。個人的には、テスト済みであり、ユーザーが期待するものであるため、Appleのコードに固執することをお勧めします、また、デザイナーとしてのデザインの観点から、私自身、実際の中心が光学中心の場所であることに常に依存しているわけではありません。

于 2010-04-07T23:21:27.490 に答える
5

おそらく、ウィンドウの自動配置に違反しています。電話してみた?

[myWindowController setShouldCascadeWindows: NO];

?

于 2010-04-10T13:06:58.790 に答える
1

まず、NSWindow のプロパティ インスペクターで「dealloc on close」または「release on close」をチェックする必要があるようです。その後、ウィンドウは自動的にクリーンアップさ[self release]れ、独自のコードで (危険な) 呼び出しを削除できます。

awakeFromNibnib からのすべてのオブジェクトがアーカイブ解除され、アウトレットが接続された後に呼び出されますが、ウィンドウ座標を設定するには時期尚早かもしれません。新しいウィンドウが古いウィンドウを完全に覆い隠すことがないように、Cocoa は後続のウィンドウを既存のウィンドウの下および右に自動的に配置する何らかの作業を行っていると思います。awakeFromNib で位置を設定した後、変更を踏みにじってこれを行う可能性があります。

ウィンドウの位置を設定するのに最適な場所は、おそらく NSWindow デリゲート メソッドの 1 つ (windowWillBecomeVisible:おそらく)、または を呼び出す直前ですmakeKeyAndOrderFront:

于 2010-02-13T17:01:55.980 に答える
0

ウィンドウの中心を画面の中心に設定できるかどうかを確認してください。そして、その上にウィンドウの位置を設定します。うまくいくかもしれません。

于 2010-03-12T06:58:39.833 に答える