10
votes

Anomalie de position de fenêtre de cacao

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


1 commentaires

FTF est un nom horrible pour une variable et pourrait devenir un problème de maintenance plus tard.


4 Réponses :


1
votes

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 [auto version] dans votre propre code.

éraftfromnib 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.

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 ( WindowWillBisible: peut-être), ou éventuellement juste avant d'appeler CakeKeyandordRefront: . / p>


6 commentaires

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] 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 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] 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 à la place?


La discussion sur l'appelant [auto version] est une distraction de votre problème principal: Positionnement de la fenêtre . Avez-vous eu un succès à l'aide d'une méthode de délégué comme windowwillbecomeVisible: au lieu de mettre le code dans ewakefromnib ?


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.



0
votes

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.


0 commentaires

14
votes

Donc, comme je le comprends, vous voulez centrer la fenêtre à l'écran?

Bien en supposant NSWINDOW * fenêtre code> Votre objet est votre objet de fenêtre alors qu'il y a deux méthodes ... P> XXX PRE>

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>

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


0 commentaires

5
votes

Vous courez probablement au fait du positionnement automatique de la fenêtre. Avez-vous essayé d'appeler xxx

?


0 commentaires