J'ai un problème étrange de positionnement d'une fenêtre à l'écran. Je veux centrer la fenêtre à l'écran, mais je ne sais pas comment faire ça. Voici ce que j'ai. La fenêtre est créée à partir de NIB par le contrôleur principal:
IdentFormController *ftf = [[IdentFormController alloc] initWithWindowNibName:@"IdentForm"]; [[ftf window] makeKeyAndOrderFront:self];
4 Réponses :
Tout d'abord, cela ressemble à vous avoir besoin de vérifier "DealLoc sur ferme" ou "Libération à proximité" dans l'inspecteur de la propriété de Nswindow. Ensuite, la fenêtre se nettoisera après elle-même et vous pouvez supprimer l'appel (risqué) sur Le meilleur endroit pour définir la position de votre fenêtre est probablement dans l'une des méthodes de délégués Nswindows ( [auto version] code> dans votre propre code. P>
éraftfromnib code> est appelé après que tous les objets du NIB ont été non arrêtés et des prises de vente ont été connectées, mais cela peut être trop tôt pour définir les coordonnées de la fenêtre. Je crois que le cacao fait que certains fonctionnent pour positionner automatiquement les fenêtres suivantes ci-dessous et à droite des fenêtres existantes, de sorte que de nouvelles fenêtres ne masquent pas complètement les anciennes. Cela fait probablement cela après avoir réglé la position dans Awakefromnib, en piétant vos changements. P>
WindowWillBisible: Code> peut-être), ou éventuellement juste avant d'appeler
CakeKeyandordRefront: code>. / p>
Pour une raison quelconque, cela n'a pas fonctionné lorsque la libération sur la fermeture a été vérifiée. La fenêtre aurait pu réactiver et nettoyer, mais que diriez-vous du contrôleur? Peut-être que ce n'était pas distribué. Dès que j'ai ajouté [auto libération] - la chose a finalement travaillé. Peut-être que c'est risqué, mais au moins cela fonctionne et lorsque vous relâchez un contrôleur, il nettoie également la fenêtre.
Je pense que j'ai mal interprété [auto version] code> comme appliquer à l'instance Nswindow, pas le contrôleur. Peut-être que de rendre les choses plus claires, votre déléguée de l'application doit maintenir un pointeur sur la présente IdentifController actuelle. Ou si vous devez vous relâcher auto, utilisez
AutoRelease code> de sorte que l'objet n'est pas distribué avant la fin de la boucle d'exécution. Quoi qu'il en soit: a déplacé le code à une méthode de déléguée aide?
Eh bien, je n'ai pas encore eu la chance de le tester, mais je suis sûr que cela fonctionnerait. Si cela fonctionne avec [auto libération] - alors pourquoi ne marcherait-il pas de l'extérieur? Au fait: pourquoi [auto libération] est-il risqué? Si je suis sûr que je n'aurai pas besoin de ce contrôleur et que rien ne va essayer d'y accéder - quels problèmes pourraient survenir avec [auto libération]?
[auto version] code> est risqué car vous pourriez exécuter le code d'un objet libéré. Si c'est la dernière ligne de votre méthode, vous serez probablement bien la plupart du temps, mais il n'y a pas de garantie. Pourquoi risquer si vous pouvez appeler
Autoréleuillet code> à la place?
La discussion sur l'appelant [auto version] code> est une distraction de votre problème principal: Positionnement de la fenêtre B>. Avez-vous eu un succès à l'aide d'une méthode de délégué comme
windowwillbecomeVisible: code> au lieu de mettre le code dans
ewakefromnib code>?
Désolé, ne pourra pas tester cela pendant un moment. J'ai eu du succès même dans Awakefromnib après que je me suis assuré que le contrôleur précédent ait été détruit. Avant cela, je ne pouvais pas définir de position du tout, cela n'a fonctionné que la première fois. Je vais simplement utiliser votre idée précédente et modifier l'application pour détruire le contrôleur précédent en dehors de lui-même avant de créer un autre. Ensuite, cela fonctionnera également et il n'y aura pas de communiqués dans le contrôleur lui-même. Et même si tout fonctionne comme un charme maintenant, le mystère de la raison pour laquelle cela n'a pas fonctionné avant de rester immobile.
Vérifiez si vous pouvez définir le centre de votre fenêtre avec le centre de votre écran. Et réglez la position de la fenêtre dessus. Cela pourrait marcher. p>
Donc, comme je le comprends, vous voulez centrer la fenêtre à l'écran?
Bien en supposant C'est le meilleur moyen de le faire, mais il sera de compter pour prendre en compte le poids visuel et la présence du quai. P> Si vous voulez du centre mort, cela fonctionnerait. .. p> NSWINDOW * fenêtre code> Votre objet est votre objet de fenêtre alors qu'il y a deux méthodes ... P> XXX PRE>
// 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];
Vous courez probablement au fait du positionnement automatique de la fenêtre. Avez-vous essayé d'appeler ? P> p>
FTF i> est un nom horrible pour une variable et pourrait devenir un problème de maintenance plus tard.