2010-02-12 7 views
10

Ich habe ein seltsames Problem mit der Positionierung eines Fensters auf dem Bildschirm. Ich möchte das Fenster auf dem Bildschirm zentrieren, aber ich weiß nicht, wie ich das machen soll. Hier ist, was ich habe. Das Fenster wird aus nib durch die Hauptsteuerung erstellt:Cocoa Fenster Position Anomalie

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

Nun ist der IdentFormController hat awakeFromNib() Verfahren, in dem er versucht, das Fenster zu positionieren. Aus Gründen der Einfachheit habe ich gerade versucht, SetFrameOrigin (NSMakePoint (0, 0)) zu tun. Was passiert, ist wie folgt:

Das erste Mal, wenn ich dieses Fenster erstelle, funktioniert alles wie erwartet. Aber wenn ich es nach dem Loslassen des vorherigen wieder erstelle, erscheint es an zufälligen Positionen. Warum macht es das?

+5

* ftf * ist ein schrecklicher Name für eine Variable und könnte später zu einem Wartungsproblem werden. –

Antwort

1

Zunächst klingt es so, als ob Sie im Eigenschafteninspektor von NSWindow "dealloc on close" oder "release on close" aktivieren müssen. Dann bereinigt das Fenster sich selbst und Sie können den (riskanten) Anruf zu [self release] in Ihrem eigenen Code entfernen.

awakeFromNib wird aufgerufen, nachdem alle Objekte aus der Nib entfernt wurden und die Ausgänge verbunden wurden, aber das kann zu früh sein, um die Fensterkoordinaten festzulegen. Ich glaube, Cocoa arbeitet daran, nachfolgende Fenster automatisch unterhalb und rechts von bestehenden Fenstern zu positionieren, so dass neue Fenster alte nicht komplett verdecken. Dies geschieht wahrscheinlich, nachdem Sie die Position in watchFromNib festgelegt haben und auf Ihre Änderungen stampfen.

Der beste Ort, um Ihre Fensterposition zu setzen, ist wahrscheinlich in einer der NSWindow-Delegate-Methoden (windowWillBecomeVisible: vielleicht) oder möglicherweise direkt vor dem Anruf makeKeyAndOrderFront:.

+0

Aus irgendeinem Grund funktionierte es nicht, wenn die Freigabe beim Schließen überprüft wurde. Das Fenster könnte sich freigegeben haben und aufgeräumt haben, aber was ist mit dem Controller? Vielleicht wurde es nicht freigegeben. Sobald ich [Self Release] hinzugefügt habe - das Ding hat endlich funktioniert.Vielleicht ist es riskant, aber zumindest funktioniert es und wenn du einen Controller loslässt, räumt er auch das Fenster auf. – Marius

+0

Ich glaube, ich habe "[self release]" als falsch für die NSWindow-Instanz interpretiert, nicht für den Controller. Vielleicht sollte Ihr App-Delegat einen Zeiger auf den aktuellen IdentFormController führen, um die Dinge klarer zu machen. Oder wenn Sie self freigeben müssen, verwenden Sie 'autorelease', so dass das Objekt erst am Ende der Ausführungsschleife freigegeben wird. Unabhängig davon: Hat das Verschieben des Codes in eine Delegate-Methode geholfen? – benzado

+0

Nun, ich hatte noch keine Gelegenheit, es zu testen, aber ich bin sicher, es würde funktionieren. Wenn es mit [Selbstveröffentlichung] zusammenarbeitet - warum sollte es dann nicht von außen funktionieren? Übrigens: Warum ist [Self Release] riskant? Wenn ich sicher bin, dass ich diesen Controller nicht brauche und nichts darauf zugreifen wird - welche Probleme könnten mit [Self Release] auftreten? – Marius

0

Überprüfen Sie, ob Sie die Mitte Ihres Fensters mit der Mitte des Bildschirms festlegen können. Und setze die Fensterposition darauf. Es könnte funktionieren.

14

So wie ich es verstehe, möchten Sie das Fenster auf dem Bildschirm zentrieren?

Nun NSWindow *window Annahme ist Ihr Fenster Objekt dann gibt es zwei Methoden ...

[window center]; 

Dies ist der beste Weg, es zu tun, aber es wird ofset berücksichtigt visuelles Gewicht und das Docks Präsenz zu nehmen.

Wenn Sie Totpunkt wollen, dann würde dies funktionieren ...

// 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]; 

Dieser Code ist nicht getestet, aber es gibt Ihnen eine Vorstellung von dem, was Sie tun müssen, um dieses Ding zum Laufen zu bringen, wie Sie wollen, persönlich würde ich Ihnen empfehlen, sich an Apples Code zu halten, weil er getestet wurde und das, was der Benutzer erwarten würde, auch aus einer Designperspektive als Designer selbst. Ich verlasse mich nicht immer auf das eigentliche Zentrum, wo sich das optische Zentrum befindet ist.

5

Sie haben wahrscheinlich Probleme mit der automatischen Fensterpositionierung. Haben Sie versucht, anzurufen

[myWindowController setShouldCascadeWindows: NO]; 

?