Question

Je dois comprendre comment NSView autoresizes vues est tout. J'ai mis tout en IB et mes sous-vues redimensionne bien (quand je redimensionner ma fenêtre autour avec une souris). Cependant, si je fais [myMainView setFrame:] avec mon nouveau rect cadre, rien ne se passe. Tous mes sous-vues sont toujours la taille d'origine (même si la vue principale a les dimensions correctes). Le resizeWithOldSuperviewSize: de l'enfant est appelé, mais il est toujours pas de taille appropriée.

J'ai un écran plein d'éléments de cacao à l'écran (écran # 1), l'étiquette, image, vidéo. Il y a une disposition bien définie pour ces éléments. J'ai comportement Autoresizing de configuration via Interface Builder qui fonctionne très bien. Redimensionnement de la fenêtre principale de redimensionner les éléments d'une manière satisfaisante.

Maintenant, l'utilisateur clique sur le bouton « next », après quoi un deuxième écran rempli d'éléments (écran # 2) doit être établie. Mes mises en page sont construites sur une base screensize canonique (par exemple, 800x600). Mais maintenant, la fenêtre est plus grande (ou plus petit) parce qu'il a été redimensionnée à l'écran # 1. Ainsi, les éléments sont en train de prendre seulement une petite zone dans la fenêtre, au lieu d'être de taille appropriée pour remplir l'espace disponible. Je veux à l'échelle de ces éléments.

je comprends mal comment fonctionne un redimensionnement automatique? Comment puis-je déclencher le mécanisme de autoresize sous NSView manuellement?

Il y a deux choses que je peux faire:

  1. manuellement redimensionner les éléments en fonction de la taille de l'écran par rapport à la taille d'origine. Cette option est mon préféré, car apparemment, je suis obligé de réécrire le code qui fonctionne déjà dans NSView (le comportement Autoresizing
  2. Ma deuxième option est d'invoquer le redimensionnement automatique de la magie NSView précitée. Documentation implique que [NSView setFrame:] fera pour moi. Ce que j'ai essayé était, redimensionner mon point de vue du contenu à la screensize originale (800x600), rendre mes éléments, puis le redimensionner à la taille de la fenêtre en cours. Conceptuellement, est-il pas identique à redimensionner manuellement la fenêtre? Il ne semble pas être. Encore une fois, cette option est préférable car il réduit la quantité de code qui sera écrit et maintenu te.
Était-ce utile?

La solution 2

Il s'avère que mon approche est correcte. Je mettais la taille de l'image à une valeur incorrecte, donc je ne recevais pas le comportement attendu. Doh.

Autres conseils

Ce code

NSView* superView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
NSView* subView   = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
[superView addSubview:subView];

[superView setAutoresizesSubviews:YES];
[subView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];

NSLog(@"subview's frame before resizing: %@", NSStringFromRect([subView frame]));
[superView setFrame:NSMakeRect(0, 0, 200, 100)];
NSLog(@"subview's frame after  resizing: %@", NSStringFromRect([subView frame]));

ne donne le résultat escompté:

[...] subview's frame before resizing: {{0, 0}, {100, 100}}
[...] subview's frame after  resizing: {{0, 0}, {200, 100}}

Votre problème est ailleurs. Je pense que l'un de vos vues de conteneurs ne fait pas partie de la hiérarchie de la vue de la fenêtre au moment où le redimensionnement se produit.

Une bonne solution pour votre problème pourrait être l'utilisation d'un NSTabView sans onglets, car alors tous vos points de vue sont à tout moment dans la fenêtre (peut-être caché) et le TabView prend en charge le redimensionnement.

Une autre solution est de mettre plusieurs points de vue sur le dessus de l'autre et utiliser setHidden: pour montrer qu'un seul.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top