Garder constante la hauteur d'un NSDrawer

Eddy58Eddy58 Membre
15:18 modifié dans API AppKit #1
Pour certaines raisons esthétiques, j'ai besoin de garder la hauteur de mon NSDrawer constante, hors le problème est qu'avec le trailing offset du drawer, le redimensionnement de la fenêtre change en conséquence la hauteur du drawer. Un moyen simple est de recalculer le trailing offset en fonction de la hauteur de la fenêtre, mais n'existe-t-il pas de méthode plus élégante ? :)

Réponses

  • cbrandtcbrandt Membre
    15:18 modifié #2
    dans le délégate du drawer, implémente
    - (NSSize)drawerWillResizeContents:(NSDrawer *)sender toSize:(NSSize)contentSize
  • Eddy58Eddy58 Membre
    janvier 2005 modifié #3
    C'est une excellente idée, mais ça marche pas ! :'(
    J'ai mis mon controleur en delegate du drawer, puis implémenté la méthode dans le controleur :
    [tt]
    -(NSSize)drawerWillResizeContents:(NSDrawer *)sender toSize:(NSSize)contentSize
    {
    NSLog(@OK);
    return NSMakeSize(219,447);
    }
    [/tt]
    Mais quand je redimensionne la fenêtre, ce qui redimensionne le drawer, et bien ça ne fait rien, la méthode n'est même pas appelée car le NSLog ne donne rien... ???
    Mes paramètres de drawer dans IB sont :
    Les 3 paramètres width : 219
    Les 3 paramètres height : 447
    Leading offset : 0
    Trailing offset : 195
  • Eddy58Eddy58 Membre
    15:18 modifié #4
    Bon, la méthode delegate ci-dessus ne donne aucun signe de vie (buggée ? ???), mais peut-être fonctionne-t-elle mieux sous Tiger... ;D
    J'essaie d'arriver à  mes fins avec la notification de changement de taille de la fenêtre NSWindowDidResizeNotification.
    Je recalcul donc sans problème le trailing offset. Tout se passe admirablement bien quand j'agrandis la fenêtre le bas du drawer reste à  sa place comme prévu, mais un nouveau problème se présente au moment ou je veux réduire la taille de la fenêtre, et bien elle ne veut pas, et elle n'aspire qu'à  continuer son agrandissement...
    Avec un log je vois que la minSize de la fenêtre évolue également...Je rajoute un setMinSize pour tenter de garder constante la minSize mais ça ne marche pas, la valeur évolue toujours, je met alors un setContentSize pour le drawer, qui fixe bien sa hauteur, mais le problème de la fenêtre qui ne veut plus se réduire est toujours là ...

    [tt]
    -(void)mainWindowResized:(NSNotification *)notification
    {
    [ficheClientDrawer setTrailingOffset:[mainWindow frame].size.height-447-39];
    [ficheClientDrawer setContentSize:NSMakeSize (219,447)];
    [mainWindow setMinSize:NSMakeSize (795,681)];
    }
    [/tt]

    A moins que quelqu'un ait une idée, je vais m'orienter sur une solution voisine, je vais laisser évoluer le trailing offset, et recalculer le leading offset, j'espère que ça ira mieux... :P
  • Eddy58Eddy58 Membre
    15:18 modifié #5
    Ben ça marche pas mieux en jouant sur le leading offset, ça fait la même chose, la fenêtre ne veut plus se réduire après.....:( va falloir que je trouve une autre solution....  >:)
  • Eddy58Eddy58 Membre
    15:18 modifié #6
    Bon, je me répond encore à  moi-même. :P

    En ce qui concerne la méthode delegate :
    [tt]
    -(NSSize)drawerWillResizeContents:(NSDrawer *)sender toSize:(NSSize)contentSize
    [/tt]
    Celle-ci fonctionne très bien, mais elle est appelée dans le cas où on utilise la poignée de redimensionnement du drawer, cette méthode est donc plutôt là  pour faire des contrôles de largeur du drawer...

    J'ai essayé pas mal de choses sans succés, et j'ai finalement opté pour la solution la plus propre (moins que celle que je voulais au début je trouve...), en utilisant les autosizing, ce qui me permet d'étaler une partie de la GUI du drawer quand celui-ci s'aggrandit, et ainsi éviter des blancs dans la view... :)

    Sinon, j'ai déjà  fait des fenêtres entièrement customisées de A à  Z par le passé, et j'ai réussi à  leur attacher un drawer dont j'arrive à  garder la hauteur constante sans mal, quelque soit le redimensionnement de la fenêtre (méthode maison) en jouant avec les offsets du drawer....Apparemment, ce que je retire de tout cela, c'est que ça doit être dans la nature d'Aqua d'interdire au drawer d'être constant sur le bord d'attache voulu....

    Si seulement Apple pouvait nous rajouter dans le futur des petits flags du genre setConstantHeight:YES, ça le ferait bien...:)
  • cbrandtcbrandt Membre
    février 2005 modifié #7
    après tests, voici ma proposition de solution:

    dans le windowcontroller, pour un drawer centré en hauteur, de hauteur fixe 200, sur un côté de la fenêtre, ajoute:

    <br />- (void) windowDidResize: (NSNotification*) notification<br />{<br />	float		height;<br />		<br />	height = [[self window] frame].size.height;<br />	[mondrawer setLeadingOffset: (height - 200.0) / 2.0];<br />	[mondrawer setTrailingOffset: (height - 200.0) / 2.0];<br />}<br />
    


    je n'ai pas le problème que tu décris, celui de la fenêtre qui ne veut pas se réduire... ???
  • Eddy58Eddy58 Membre
    15:18 modifié #8
    Ha voilà  j'ai trouvé la petite bête ! :brule:

    Merci cbrandt de ton message, celui-ci m'a amené à  reconsidérer mes dires ci-dessus et à  me repencher sur le problème originel. En passant, ton code est bon dans le principe, mais là  tu calcules un leading et un trailing qui ont la même valeur, et je pense pas que ça donne grand chose...

    J'ai donc fait un projet de test, puis j'ai peu à  peu intégré les paramètres du projet originel, et j'ai finalement compris pourquoi la fenêtre ne voulait plus se réduire. :)
    Tout se passe dans les réglages de taille du drawer, à  l'origine, comme mon drawer ne doit pas changer de taille, en toute logique j'ai mis toutes les content size (initial, min et max) à  la même valeur : 219,447. Hors c'est de là  que vient le problème, et je n'ai pas tout compris sur ce coup-là  ! :crackboom:-
    La valeur de 219 en largeur sur toutes les content size est bonne.
    La valeur de 447 en hauteur dans les min et max content size est la cause au problème de fenêtre qui ne veut plus se réduire...
    Je m'aperçois qu'une valeur inférieure règle le problème. Je remarque quelque chose sur cette valeur inférieure, c'est que plus elle est proche de la valeur initiale, et plus la fenêtre mettra du temps à  se réduire. Une valeur de 446, et quand on drag le controle de resizing de la fenêtre vers le haut, et bien la fenêtre se réduira tout doucement. Une valeur de 440, et ça ira déjà  plus vite. J'ai donc réglé une valeur de 0 sur les height content size min et max pour être tranquille, mais je ne comprend pas cette histoire de valeur inférieure...???
    Donc j'ai pu finaliser mon idée d'origine, avec un drawer ne variant pas en origine et en taille, en jouant avec le trailing offset. :kicking:
    Juste un tout petit peu de code au final pour gérer ça.... :)
    [tt]
    -(void)windowDidResize:(NSNotification *)notification
    {
    [monDrawer setTrailingOffset:[mainWindow frame].size.height-447-39];
    }
    [/tt]
  • cbrandtcbrandt Membre
    15:18 modifié #9
    dans 1107473447:

    mais là  tu calcules un leading et un trailing qui ont la même valeur


    avec un leading offset et un trailing offset de la même valeur, le drawer sera centré; avec le leading à  0, il sera calé contre le bord supérieur de la fenêtre, et avec le treiling à  0, il sera calé contre le bord inférieur de la fenêtre.

    je prends la hauteur de la fenêtre, je retire la taille souhaitée de mon drawer (200 dans mon exemple), et j'ai mon offset... à  utiliser en leading, ou en trailing, ou comme dans mon exemple à  répartir entre les deux.

    j'ai rejoué dans mon petit projet de test, et effectivement, si on touche trop aux min et max content size, ça part en c...... 
  • Eddy58Eddy58 Membre
    15:18 modifié #10
    dans 1107517488:

    avec un leading offset et un trailing offset de la même valeur, le drawer sera centré; avec le leading à  0, il sera calé contre le bord supérieur de la fenêtre, et avec le treiling à  0, il sera calé contre le bord inférieur de la fenêtre.

    je prends la hauteur de la fenêtre, je retire la taille souhaitée de mon drawer (200 dans mon exemple), et j'ai mon offset... à  utiliser en leading, ou en trailing, ou comme dans mon exemple à  répartir entre les deux.

    Oui c'est vrai, j'ai du confondre avec autre chose sur le coup et c'est moi qui me suis mélangé les pinceaux...:P

    dans 1107517488:

    j'ai rejoué dans mon petit projet de test, et effectivement, si on touche trop aux min et max content size, ça part en c...... 

    Oui tu vois hein ? :)
    Ce n'est pas logique comme comportement et ça sent le bug là ....  ::)
Connectez-vous ou Inscrivez-vous pour répondre.