Masquer/Visualiser une vue avec SplitView

mac_manumac_manu Membre
16:35 modifié dans API AppKit #1
Bonjour,
Je cherche désespéremment comment faire pour, comme c'est le cas dans iCal par ex., visualiser ou masquer le calendrier en cliquant sur un bouton. Plus précisemment, comment faire pour que le mouvement se fasse en live!! (pour une fenêtre, j'ai trouvé la fonction:
// setFrame:display:animate: //
Existe-t-il quelque chose de similaire avec les splitView ou les View, où faut-il sous-classer?
2ème question puisque nous sommes dans les splits, comment masquer le petit bouton de la split lorsque celui-ci est complètement "fermé".
Merci aux bonnes idées...

Réponses

  • fouffouf Membre
    16:35 modifié #2
    Pour le bouton de la split, je pense que le mieux est de sous-classer NSSplitView et de surcharger les méthodes dividerThickness et drawDividerInRect: . Par contre, ne me demande pas comment faire après, je n'y connais rien ::) ;)
  • ChachaChacha Membre
    août 2005 modifié #3
    Non, pas besoin de sous-classer, simplement, redimensionne les vues constituant ton splitView avec des setFrame. En le faisant plusieurs fois, ça donne une animation.

    Je m'explique.
    Imagine, tu as une split view qui divise en deux vues, une vue topView et une vue bottomView.
    La hauteur totale est par exemple 100. Quand bottomView est visible, elle occupe une hauteur de 10, et l'autre 90, sinon 0 et 100.

    <br />-(void) setBottomViewVisible:(BOOL)visible<br />{<br />  NSRect topFrame = [topView frame];<br />  NSRect bottomFrame = [bottomView frame];<br />  const float height = 100; //hauteur totale<br /><br />  //calcule les nouvelles hauteurs à  attribuer<br />  const float newBottomHeight = visible ? 10 : 0;<br />  const float newTopHeight   = visible ? height-bottomHeight : height;<br /><br />  int i = 0;<br />  for(i = 0 ; i&lt;=10 ; ++i)//une boucle pour l&#39;animation<br />  {<br />    const float factor = i/10.0f;//varie de 0 à  1<br /><br />    //calcule les nouvelles frames de l&#39;étape courante de l&#39;anim<br />    NSRect newTopFrame = topFrame;<br />    NSRect newBottomFrame = bottomFrame;<br />    newTopFrame.size.height = (1-factor)*topFrame.size.height + factor*newTopHeight;<br />    newBottomFrame.size.height   = (1-factor)*bottomFrame.size.height + factor*newBottomHeight;<br /><br />   //redimensionne<br />   [topView setFrame:newTopFrame]; <br />   [bottomView setFrame: newBottomFrame];<br /><br />   //répercuter ça sur le splitview<br />   [splitView adjustSubviews]; <br />   [splitView displayIfNeeded];<br /><br />   //dormir un peu (je sais pas si c&#39;est très utile ici...)<br />   [NSThread sleepUntilDate:[[NSDate date] addTimeInterval:1/100.0f]];<br />  }<br />}<br />
    


    ça devrait marcher.
    +
    Chacha
  • mac_manumac_manu Membre
    16:35 modifié #4
    Merci Chacha, je n'avais pas pensé à  cette solution. Je vais essayer cela demain et te tiendrai au courant. Merci également à  fouf, car c'est toujours l'échange d'idée qui donne les solutions!!
    A+ donc... ;)
    mac_manu
  • mac_manumac_manu Membre
    16:35 modifié #5
    <3 Super, ça fonctionne... Effectivement, je n'ai pas dû utiliser la ligne de code: [NSThread sleepUntilDate:<a href="/?page=NSDate_date%5D_addTimeInterval%3A1%2F100.0f" class="bbcode_wiki">NSDate date] addTimeInterval:1/100.0f;. Et pour masquer complètement la splitView, j'ai tout simplement mis la variable newBottomHeight à  -5, comme ceci: const float newBottomHeight = visible ? 10 : -5;
    Alors encore merci et à  la prochaine.
    mac_manu
Connectez-vous ou Inscrivez-vous pour répondre.