Chargement dynamique de vues

FloFlo Membre
08:31 modifié dans API AppKit #1
Bonjour à  tous,

j'ai un petit soucis qui m'a occupé toute la soirée d'hier et que je n'arrive pas à  résoudre  :'(
En gros j'ai une BWSplitView verticale avec la bottom view en collapsible. Au départ la bottom view est collapsée et je souhaiterai lui ajouter une vue chargée dynamiquement (via NSWindowController) avant de la montrer à  l'utilisateur quand il clique sur un bouton.

J'ai donc le code suivant :
<br />- (IBAction) addQuotations: (id)sender<br />{	<br />	// creates the required controller if needed<br />	if (!self.addQuotationsViewController)<br />	{<br />		// loads the add quotations view&#039;s nib for the first time<br />		ITAddQuotationsViewController *newAddQuotationViewController = <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  [[ITAddQuotationsViewController alloc] initWithNibName: ADD_QUOTATIONS_VIEW_NIB bundle: nil];<br />																													 <br />		NSView *addQuotationsView = newAddQuotationViewController.view;<br />		<br />		addQuotationsView.frame = self.bottomLeftAndCornerView.bounds;<br />		<br />		[self.bottomLeftAndCornerView addSubview: addQuotationsView];<br />		<br />		self.addQuotationsViewController = newAddQuotationViewController;<br />		[newAddQuotationViewController release];<br />	}<br />	else <br />	{<br />		NSView *addQuotationsView = self.addQuotationsViewController.view;<br />		NSArray *bottomLeftAndCornerSubViews = [self.bottomLeftAndCornerView subviews];<br />		<br />		// remove the previous bottom left and corner view&#039;s content if needed<br />		if (![bottomLeftAndCornerSubViews containsObject: addQuotationsView])<br />		{<br />			[self.bottomLeftAndCornerView replaceSubview: [bottomLeftAndCornerSubViews objectAtIndex: 0] <br />													with: addQuotationsView];<br />		}<br />	}<br />	<br />	// shows the bottom left and corner view if needed<br />	if (self.leftSplitView.collapsibleSubviewCollapsed)<br />	{<br />		[self.leftSplitView toggleCollapse: nil];<br />	}<br />}<br />


La bottomLeftAndCornerView se montre bien mais elle semble vide (=la addQuotationsView n'est pas affichée bien qu'elle lui ait été ajoutée). Il y a en outre deux comportements bizarres :
- si je bouge le separator vers le haut, l'addQuotationsView se dessine progressivement en fonction du déplacement (capture jointe)
- si je bouge le separator jusqu'à  le limite basse et que je le remonte l'addQuotationsView s'affiche correctement en fonction du déplacement.

J'ai essayé de mettre des setNeedsDisplay: YES dans tous les coins sans succès.
J'ai également essayé de fixer moi même le frame.origin de l'addQuotationsView et de changer à  la main toutes ses dimensions sans plus de réussite.

Quelqu'un aurait une idée ?  ???

Merci !

Réponses

  • AliGatorAliGator Membre, Modérateur
    08:31 modifié #2
    effet de bord de autoresizingMask (au hasard) ?
  • CéroceCéroce Membre, Modérateur
    08:31 modifié #3
    Je pense la même chose qu'Ali.

    Essaie aussi d'intervertir ces deux lignes:

    [self.bottomLeftAndCornerView addSubview: addQuotationsView];<br />addQuotationsView.frame = self.bottomLeftAndCornerView.bounds;
    

  • FloFlo Membre
    08:31 modifié #4
    J'ai d'abord pensé à  ça moi aussi, j'ai essayé de forcer l'autoresizingMask à  la main sans succès.

    En fait le problème est lié au comportement de BWSplitView qui met la hauteur de la bottomLeftAndCornerView à  zéro quand elle est collapsée. Du coup quand je fait :
    addQuotationsView.frame = self.bottomLeftAndCornerView.bounds;
    


    et bien la hauteur de addQuotationsView est également à  zéro. BWSplitView gère le uncollapse d'une view à  l'aide d'un attribut (int uncollapseSize) qui correspond à  la hauteur de la bottomLeftAndCornerView avant le dernier collapse. Du coup il suffit de faire un truc du genre :
    <br /> [self.leftSplitView setValue: [NSNumber numberWithFloat: addQuotationsView.frame.size.height] forKey: @&quot;uncollapseSize&quot;]<br />
    


    comme ça la bottomLeftAndCornerView et la addQuotationsView ont bien les mêmes dimensions et les mêmes positions.
    Il n'y a pas de property associé à  l'attribut int uncollapseSize, du coup je suis obligé de passer par le KVC mais si certains ont d'autres solutions je suis preneur !

    Merci pour vos réponses 
  • CéroceCéroce Membre, Modérateur
    08:31 modifié #5
    Je ne comprends pas bien. Il y a forcément un endroit où il faut spécifier la hauteur maximale de la vue bottomLeftAndCornerView. Sur quoi la splitview s'appuie ? Sur la taille qu'a la bottomLeftAndCornerView lors de son insertion ?
  • FloFlo Membre
    08:31 modifié #6
    C'est vrai que c'est un peu confus mon affaire donc pour faire plus simple :
    - J'ai une BWSplitView A qui contient deux subviews B(supérieure) et C(inférieure)
    - Je souhaite remplir la subview C avec une vue D chargée dynamiquement

    Le problème initial était qu'après avoir ajouté D dans C et uncollapsé C, D ne s'affichait que si on bougeait le séparateur et qui plus est de manière progressive (comme sur la capture que j'avais fournie).

    La solution c'est de garder la taille initiale de D quand on la charge car dès son ajout, elle prends une taille de zéro (inverser les deux lignes du code précédent ne change rien à  ce comportement). BWSplitView conserve dans la variable uncollapseSize la taille de C avant le dernier collapse. Donc en gros il suffit de faire :
    <br />[self.A setValue: [NSNumber numberWithFloat: D.frame.size.height] forKey: @&quot;uncollapseSize&quot;]<br />
    


    Et du coup au prochain uncollapse, C et D auront bien les mêmes dimensions, elles seront superposées  :D
  • FloFlo Membre
    08:31 modifié #7
    Du coup j'ai fait une méthode plus générique, qui permet de toggle une view de splitview avec une autre view (que d'anglicismes...  :o )
    <br />- (void) toggleBottomLeftAndCornerViewWithView: (NSView *)view uncollapseSize: (NSNumber *)uncollapseSize<br />{<br />	NSArray *bottomLeftAndCornerViewSubviews = self.bottomLeftAndCornerView.subviews;<br />	<br />	if ([bottomLeftAndCornerViewSubviews containsObject: view])<br />	{<br />		if (self.leftSplitView.collapsibleSubviewCollapsed)<br />		{<br />			// the bottom left and corner view will uncollapse with the given size<br />			[self.leftSplitView setValue: uncollapseSize forKey: @&quot;uncollapsedSize&quot;];<br />			<br />			// sets the proper view&#039;s size for the bottom left and corner view uncollapse<br />			[view setFrameSize: NSMakeSize(view.frame.size.width, [uncollapseSize floatValue])];<br />			<br />			// shows the bottom left and corner view<br />			[self.leftSplitView toggleCollapse: nil];<br />		}<br />	}<br />	else <br />	{<br />		if (!self.leftSplitView.collapsibleSubviewCollapsed)<br />		{<br />			// collapses the bottom left and corner view<br />			[self.leftSplitView toggleCollapse: nil];<br />		}<br />		<br />		if (bottomLeftAndCornerViewSubviews.count)<br />		{<br />			// replace the previous bottom left and corner view&#039;s content<br />			[self.bottomLeftAndCornerView replaceSubview: [bottomLeftAndCornerViewSubviews objectAtIndex: 0] with: view];<br />		}<br />		else<br />		{<br />			[self.bottomLeftAndCornerView addSubview: view];<br />		}<br />		<br />		// the bottom left and corner view will uncollapse with the given size<br />		[self.leftSplitView setValue: uncollapseSize forKey: @&quot;uncollapsedSize&quot;];<br />		<br />		// sets the proper view&#039;s size for the bottom left and corner view uncollapse<br />		[view setFrameSize: NSMakeSize(view.frame.size.width, [uncollapseSize floatValue])];<br />		<br />		// shows the bottom left and corner view<br />		[self.leftSplitView toggleCollapse: nil];<br />	}<br />}<br />
    

Connectez-vous ou Inscrivez-vous pour répondre.