Probleme de positionnement dans une NSScrollView

Guillaume CGuillaume C Membre
21:29 modifié dans API AppKit #1
Bonjour,

J'ai un probleme avec une interface. J'ai mis un NSLabel dans une NSView (Layout | Embed Objects in | Custom View), que j'ai mise ensuite dans une NSScrollView. Le NSLabel doit rester en haut à  gauche. La NSView est grande et ne se re-dimensionne pas. La NSScrollView se re-dimensionne avec la fenetre. J'ai normalement defini tout ca dans IB. Probleme: ca me marche pas. Le NSLabel ne veut pas rester en haut a gauche, mais en bas a gauche, c'est toujours la distance entre le NSLabel et le bas de la NSScrollView qui reste constante, alors que j'ai choisi le contraire dans IB. J'attache un ficher exemple. Je ne comprends pas pourquoi cela me marche pas alors que c'est sans doute si simple!

Merci pour votre aide!

Guillaume

Réponses

  • RocouRocou Membre
    21:29 modifié #2
    dans 1253456346:

    Bonjour,

    J'ai un probleme avec une interface. J'ai mis un NSLabel dans une NSView (Layout | Embed Objects in | Custom View), que j'ai mise ensuite dans une NSScrollView. Le NSLabel doit rester en haut à  gauche. La NSView est grande et ne se re-dimensionne pas. La NSScrollView se re-dimensionne avec la fenetre. J'ai normalement defini tout ca dans IB. Probleme: ca me marche pas. Le NSLabel ne veut pas rester en haut a gauche, mais en bas a gauche, c'est toujours la distance entre le NSLabel et le bas de la NSScrollView qui reste constante, alors que j'ai choisi le contraire dans IB. J'attache un ficher exemple. Je ne comprends pas pourquoi cela me marche pas alors que c'est sans doute si simple!

    Merci pour votre aide!

    Guillaume

    Chez moi il est bien en haut à  gauche.
    Attention, j'ai remarqué que sous xCode 3.2, IB ne sauvegarde pas automatiquement à  chaque compilation ou simulation!
  • Guillaume CGuillaume C Membre
    21:29 modifié #3
    dans 1253464232:

    Chez moi il est bien en haut à  gauche.
    Attention, j'ai remarqué que sous xCode 3.2, IB ne sauvegarde pas automatiquement à  chaque compilation ou simulation!


    Ah bon. Bizarre. Mais meme quand tu agrandi completement la fenetre? Chez moi, il descend. Testé sur 10.5 et 10.6, avec le simulator ou avec une vraie app.
  • Guillaume CGuillaume C Membre
    21:29 modifié #4
    Precision: le probleme apparait quand la fenetre est assez grande et le scroller de la NSScrollerView disparait. A ce moment, on voit que le NSLabel est ancré en bas!
  • Philippe49Philippe49 Membre
    septembre 2009 modifié #5
    C'est tout à  fait logique. Lorsque le scroller disparaà®t, et que tu continues à  agrandir vers le bas, le point (0,ymax) apparaà®t dans la zone vue par l'utilisateur en descendant, et il (ton label) reste bien ancré en haut. Si tu règles à  900 au lieu de 600 la hauteur de ta custom view, le phénomène apparaà®t plus tard.
  • Philippe49Philippe49 Membre
    21:29 modifié #6
    Autre solution accepte l'agrandissement automatique de cette custom view.

    et Bienvenu sur le site !
  • Guillaume CGuillaume C Membre
    21:29 modifié #7
    Merci pour la bienvenue!  :)

    Mais je ne comprends pas les explications  :'(

    Le point (0, ymax), je suppose que c'est le point (0, 600) et dans l'exemple, c'est 600 vers le bas (parce que mon repere est celui en haut a gauche). Donc le point (0, ymax), c'est le coin en bas a gauche de la view. Est-ce que (deja) je comprends correctement cette etape?

    Ensuite, quand j'agrandis la fenetre, ce point devient visible, mais je ne comprends pas pourquoi il est alors ancré en bas, et pas en haut, et ce meme quand je dis a ma view d'etre ancree en haut. Voir les copies d'ecran attachees.

    "avant" c'est comme je veux

    "apres" c'est pas bien, le label est descendu, et je suppose en fait que ce n'est pas le label tout seul, mais la view dans la scrollview qui est descendue.

    "vue ancree" et je ne comprends pas pourquoi la view descend, parce qu'elle est ancree en haut  B)

    Et effectivement, une autre solution est de laisser la view se re-dimmensioner, mais dans ce cas, l'ascenseur ne disparait jamais, meme quand il n'y en a pas vraiment besoin. Il n'y a donc pas de solutions pour avoir une view qui reste ancree en haut quand la scrollview s'agrandi?

    Merci pour toute cette aide!
  • Philippe49Philippe49 Membre
    septembre 2009 modifié #8
    dans 1253471337:

    Le point (0, ymax), je suppose que c'est le point (0, 600) et dans l'exemple, c'est 600 vers le bas (parce que mon repere est celui en haut a gauche). Donc le point (0, ymax), c'est le coin en bas a gauche de la view. Est-ce que (deja) je comprends correctement cette etape?

    Non en général, sur Mac, on prend le repère dans le sens classique. Sur ton écran, le point (0,0) est en bas à  gauche , le point [0,ymax] est comme ymax l'indique en haut. C'est-à -dire que le repère est dans le bon sens, le sens que l'on utilise quand on fait des dessins à  la main.
    Bon ceci dit, on peut changer la règle pour une view et revenir à  la règle du repère à  l'envers (voir isFlipped), et sur iPhone, le repère est aussi inversé.

    Autre particularité du graphisme sur Mac, les coordonnées sont des flottants, et non des entiers.


    dans 1253471337:

    "vue ancree" et je ne comprends pas pourquoi la view descend, parce qu'elle est ancree en haut  B)

    Oui,ancrée en haut, et l'ancre descend parce que la vue est trop petite

      <blague> : il suffit de se déshabituer de penser que le haut est en bas et que le bas est en haut : c'est pas dur  :) ) >/blague>


    dans 1253471337:

    Il n'y a donc pas de solutions pour avoir une view qui reste ancree en haut quand la scrollview s'agrandi?

    Si, si tu veux que cela se comporte à  l'envers tu peux (redéfinir isFlipped) mais si tu plonges dans le monde Mac, fais les figures à  l'endroit, c'est ce qui se fait sur plate-forme Mac ... (on fait dans l'autre sens sur plate-forme iPhone)
  • Guillaume CGuillaume C Membre
    21:29 modifié #9
    dans 1253472365:

    dans 1253471337:

    "vue ancree" et je ne comprends pas pourquoi la view descend, parce qu'elle est ancree en haut  B)

    Oui,ancrée en haut, et l'ancre descend parce que la vue est trop petite


    OK, c'etait mon probleme, parce que pour moi, une ancre ca ne bouge pas! Je vais voir ce que je peux faire avec isFlipped. Merci pour toutes ces explications!
  • Philippe49Philippe49 Membre
    21:29 modifié #10
    Si tu ancres la custom view en haut à  gauche, cela marche
  • Guillaume CGuillaume C Membre
    21:29 modifié #11
    dans 1253479080:

    Si tu ancres la custom view en haut à  gauche, cela marche


    Non, ca marche juste parce que la view fait 900 pixels, mais si elle en fait 600, quand on agrandi la fenetre, alors on voit que le meme probleme apparait. Mais je vais coder le isFlipped dans une vraie application et tester si cela marche.
  • Guillaume CGuillaume C Membre
    21:29 modifié #12
    Bon, j'ai essayé avec isFlipped, et ca ne marche pas... :'(

    Je sous-classe la view qui est dans la scrollview et je mets cette méthode:

    - (BOOL)isFlipped<br />{<br />&nbsp; &nbsp; return YES;<br />}
    


    Mais au final, je n'obtiens pas ce que je veux. J'ai l'impression que j'essaye de faire un truc qui n'a pas de sens

    Il faudrait mieux dire que des lors que la taille du contenu de la scrollview est sur le point de devenir plus longue que la taille initiale de la view, alors cette view devient elastique (et prend toujours la taille du contenu de la scrollview). Cela devrait eviter d'avoir un scroller en permanence, alors qu'il n'y en a pas besoin. Est-ce que cela a plus de sens?
  • Guillaume CGuillaume C Membre
    21:29 modifié #13
    Je crois que j'ai trouvé une solution  :)

    subclasser la NSView comme ca:

    @interface TopAnchoredView : NSView {<br />	float startHeight;<br />}<br />@end<br />@implementation TopAnchoredView<br />- (id)initWithFrame:(NSRect)frame {<br />	if ([super initWithFrame:frame]) {<br />		startHeight = NSHeight(frame);<br />	}<br />	return self;<br />}<br />- (void)setFrame:(NSRect)frame {<br />	frame.size.height = MAX([[[self enclosingScrollView] contentView] frame].size.height, startHeight);<br />	[super setFrame:frame];<br />}<br />@end
    


    Et ensuite, ca marche!
Connectez-vous ou Inscrivez-vous pour répondre.