Scroller

olivier555olivier555 Membre
22:37 modifié dans API AppKit #1
Re bonjour!
J'ai une autre question. Est-il possible de mettre un scroller idépendamment d'une vue sur PB (en fait je cherche à  dissocier complètement le scroller de ma vue puisqu'il n'aura pas le même comportement qu'un scroller normal : chaque fois que l'utilisateur bougera le scroller, des fonctions seront appelées)?

Réponses

  • cbrandtcbrandt Membre
    22:37 modifié #2
    un slider ne serait pas plus adapté ?
  • olivier555olivier555 Membre
    22:37 modifié #3
    Non, c'est bien là  le problème, parce que pour l'utilisateur, cet objet aura un rôle de scroller. En plus un scroller ne sort la valeur qu'après relâchement du bouton de la souris, et je souhaite une sortie de continu. Et puis, évidemment, il y a l'aspect graphique.
  • olivier555olivier555 Membre
    22:37 modifié #4
    Sinon j'avais pensé à  encapsuler ma vue dans une NSScrollView. Peut-on lancer un évènement d'après les scrollers d'une NSScrollView?
  • cbrandtcbrandt Membre
    22:37 modifié #5
    alors tu peux créer le nsscroller dans le awakefromnib de ton windowcontroller et l'ajouter à  la fenêtre:
    <br />scroller = [[NSScroller alloc] initWithFrame: xxx];<br />[scroller setMinValue: ...];<br />[scroller setMaxValue: ...];<br />[scroller setTarget: ...];<br />[scroller setAction: ...];<br />[scroller setContinuous: YES]; <br />...<br />[[[self window] contentView] addSubview: scroller]<br />...<br />
    
  • olivier555olivier555 Membre
    22:37 modifié #6
    OK merci beaucoup!! :p
  • olivier555olivier555 Membre
    22:37 modifié #7
    Ya quand même un truc que je comprends pas (suis-je un boulet?). Pour manipuler les NSScrollers, il faut d'abord créer une classe NSScrollView dont les NSScrollers sont ceux de cette classe? Ou alors pas besoin et c'est juste le code que l'on écrit qui les crée?
  • VeillardVeillard Membre
    22:37 modifié #8
    Normalement le code suffit.
  • fouffouf Membre
    22:37 modifié #9
    Je pense aussi. Les NSScrollView sont des vues qui ont 3 sous-vues : les deux NSScrollers et la NSClipView qui contient la vue a afficher. Tu peux donc normalement afficher les NSScrollers sans une scroll view
  • olivier555olivier555 Membre
    22:37 modifié #10
    OK
    Quand je crée le scroller, j'ai qu'un scroller horizontal. Comment qu'on fait pour en avoir un vertical??? (je sais je sais, quetion con)
  • cbrandtcbrandt Membre
    22:37 modifié #11
    t'as essayé en mettant une largeur plus faible que la hauteur ?
  • olivier555olivier555 Membre
    22:37 modifié #12
    Bon OK, j'ai changé de méthode. J'ai mis une custom view, à  laquelle j'ai rattaché une custom class NSScroller. J'ai relié un outlet de ma classe contrôleur vers ce scroller (IBOutlet id scrollerV;). Comment on fait maintenant pour faire apparaà®tre le bouton?? Et pis les flèches aussi??  :why?:
    Vous l'aurez compris, j'galère....
  • olivier555olivier555 Membre
    22:37 modifié #13
    OK alors j'ai fait des trucs... qui marchent pas. Je vous rappelle que je souhaite appeler des fonctions avec mes scrollers autour de ma NSView. Est-ce que vous pouvez m'aider?? (désolé, je ne fais que poser des questions à  la con et je suis loin d'avoir le niveau de répondre aux vôtres...) Là  j'en peux plus je vais péter un câble.
    Donc voila j'ai écrit le code suivant dans awakeFromNib:

    <br />scrollerV = [scroll verticalScroller];<br />[scrollerV setTarget:self];<br />[scrollerV setAction:@selector(machin)];<br />
    


    Où scroll est un IBOutlet pointant vers la NSScrollView mise autour de ma View. Et donc là  il se passe quelque chose de très bizare. En fait, ma classe n'est pas encore allouée quand l'awakeFromNib est exécuté. Mais lorsque j'examine self dans le débugger l'instance a une adresse A. Ensuite, j'alloue ma classe et là  l'instance a une autre adresse B. Le problème est que lorsque je bouge mon scroller, c'est l'instance A qui est sollicitée alors que je veux la B!! En fait, c'est comme s'il y avait 2 instances de cette classe portant le même nom! De plus, lorsque j'alloue dès le départ ma classe ou que je mets les lignes de code précédentes dans l'initWithFrame, rien ne se passe lorsque je bouge mon scroller. Auriez-vous une petite idée??
  • mars 2005 modifié #14
    Oups, j'arrive un peu tard, parce que pour une fois j'avais une réponse intelligente.

    Le mieux est d'encapsuler la vue dans une sous-classe de nsscrollview (dans IB)dans laquelle tu surcharges la méthode [tt]-(void)_doScroller:(NSScroller*)scroller[/tt] (je sais, elle n'est pas documentée), avec le code suivant:

    [tt]-(void)_doScroller:(NSScroller*)scroller {
    if (scroller == _hScroller) {
    //code pour le scroller horizontal
    } else {
    //code pour le scroller vertical
    }
    }[/tt]

    PS: pour ceux qui se demandent comment j'ai pu trouver ça, vu que c'est pas documenté, voici une possibilité: [tt]NSLog(NSStringFromSelector([[myScrollView verticalScroller] action]));[/tt]
  • olivier555olivier555 Membre
    22:37 modifié #15
    OK cool mais comment faire pour dessiner le knob dès le lancement??
  • olivier555olivier555 Membre
    22:37 modifié #16
    <br />-(void)awakeFromNib<br />{<br />&nbsp; &nbsp; [_vScroller setFloatValue:0.5 knobProportion:0.5];<br />&nbsp; &nbsp; [_vScroller drawKnob];<br />}<br />
    


    J'ai essayé ça mais ça marche pas. Aurais-je oublié une allocation?
  • 22:37 modifié #17
    Bon en fait, ma remarque n'était pas si intelligente que ça...

    La taille du knob dans ce cas est déterminée par la taille de la clipview, ce qui ne t'aidera pas.
  • olivier555olivier555 Membre
    22:37 modifié #18
    Ah... Merci quand même!
Connectez-vous ou Inscrivez-vous pour répondre.