Aucun scroll dans une NSScrollView

TchouboudouTchouboudou Membre
20:55 modifié dans API AppKit #1
Bonjour les gens !

J'ai une NSBox qui contient 4 NSBox qui contiennent chacune une sous-classe de NSView. Dans cette NSView, j'ai dessiné 2 images et rajouté une NSScrollView (contenant un NSTextView). Mon problème est que, même si je met les barres des défilements, je n'arrive pas à  faire défiler le texte.

Voici mon code de création de ma NSScrollView :
NSScrollView *scrollView = [[NSScrollView alloc] initWithFrame:NSMakeRect(12, 60, 199, 112)];<br />	[scrollView setHasVerticalScroller:YES];<br />	[scrollView setHasHorizontalScroller:NO];<br />	[scrollView setDrawsBackground:NO];<br />	[scrollView setBorderType:NSNoBorder];<br />	<br />	NSTextView *textView = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0, 199, 112)];<br />	[textView setDrawsBackground:NO];<br />	[textView insertText:[sticky content]];<br />	[textView setEditable:NO];<br />	[textView setSelectable:NO];<br />	[textView setRichText:NO];<br />	[textView setUsesFindPanel:NO];<br />	<br />	[scrollView setDocumentView:textView];<br />	<br />	[self addSubview:scrollView];


Voilà  :)

Je paye la tournée à  celui qui trouve :)  :p :p

Réponses

  • schlumschlum Membre
    janvier 2008 modifié #2
    Normal, ta TextView fait la même hauteur que ta ScrollView...
    Pas besoin de scroller donc  ;)

    Ton souci va donc se transformer en "comment trouver la hauteur que devrait avoir ma NSTextView avec le contenu [sticky content] et la largeur 199"
    Problème qui a déjà  été traité ici si je ne m'abuse !
  • Philippe49Philippe49 Membre
    20:55 modifié #3

    Et Vérifier quel est le comportement par défaut du réglage "show horizontal scroller", "show vertical scroller" ..
  • TchouboudouTchouboudou Membre
    20:55 modifié #4
    Merci. J'ai mis pour la hauteur [[sticky content] size].height. Mais ça ne veut toujours pas scroller...
  • schlumschlum Membre
    20:55 modifié #5
    Que vaut "[[sticky content] size].height" ?
  • TchouboudouTchouboudou Membre
    janvier 2008 modifié #6
    Sa hauteur fait 450. Mais, en fait, l'erreur provient du fait que quand je scroll, la vue est re-dessiner. Et quand je re-dessine, je supprime la NSScrollView avant de la re-faire. Comment je fais, si je supprime pas la NSScrollView avant, ça fait un gros pâté.
  • schlumschlum Membre
    20:55 modifié #7
    Ben y a un petit problème de conception là  alors...  ???
  • TchouboudouTchouboudou Membre
    20:55 modifié #8
    Voilà  mon code :

    - (void)drawRect:(NSRect)rect {<br />	if ([[self subviews] count] &gt; 0)<br />		[[[self subviews] objectAtIndex:0] removeFromSuperview];<br />	<br /> &nbsp; &nbsp;[[sticky sticky] drawInRect:rect<br />					 &nbsp; fromRect:rect<br />					 &nbsp;operation:NSCompositeSourceOver<br />					 &nbsp; fraction:1.0];<br />	<br />	if (isHighlighted) {<br />		[[NSImage imageNamed:@&quot;Contour&quot;] drawInRect:rect<br />						 &nbsp; fromRect:rect<br />						 &nbsp;operation:NSCompositeSourceOver<br />						 &nbsp; fraction:1.0];<br />	}<br />	<br />	[[NSImage imageNamed:@&quot;NotesPin&quot;] drawInRect:NSMakeRect(97.5, 174, 26, 30)<br />										fromRect:NSMakeRect(0, 0, 26, 30)<br />									 &nbsp; operation:NSCompositeSourceOver<br />										fraction:1.0];<br />	<br />	NSScrollView *scrollView = [[NSScrollView alloc] initWithFrame:NSMakeRect(12, 60, 199, 112)];<br />	[scrollView setHasVerticalScroller:NO];<br />	[scrollView setHasHorizontalScroller:NO];<br />	[scrollView setDrawsBackground:NO];<br />	[scrollView setBorderType:NSNoBorder];<br />	<br />	NSLog(@&quot;%f&quot;, [[sticky content] size].height);<br />	NSTextView *textView = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0, 199, [[sticky content] size].height)];<br />	[textView setDrawsBackground:NO];<br />	[textView insertText:[sticky content]];<br />	[textView setEditable:NO];<br />	[textView setSelectable:NO];<br />	[textView setRichText:NO];<br />	[textView setUsesFindPanel:NO];<br />	<br />	[scrollView setDocumentView:textView];<br />	<br />	[self addSubview:scrollView];<br />}
    


    Je suis preneur de tout conseil, ou quoi que ce soit ::) .
  • schlumschlum Membre
    20:55 modifié #9
    Je te déconseille de toucher à  la hiérarchie de vues dans un drawRect en tout cas !
    Je sais pas moi, tu peux jouer sur les frames, les rect, le "visible" ou n'importe quoi d'autre, mais là  c'est une hérésie ce que tu fais  :P

    Pourquoi ne pas faire ça dans le "awakeFromNib" ?
  • TchouboudouTchouboudou Membre
    20:55 modifié #10
    Bon bon, j'ai enlevé la partie scrollview et je l'ai mise dans le awakeFromNib. Par contre, j'ai un petit problème : il s'avère que je ne veux pas la barre de scroll (et normalement, dans IB, on décoche "Show Vertical Scroller" et ça marche quand même avec la roulette). Donc, j'ai mis [scrollView setHasVerticalSchroller:NO]. Et là , ça ne scroll plus... Alors, là  je me suis dit "Il y a une autre méthode !". Mais j'ai parcouru la doc, je ne trouve rien.

    Une solution : réduire la taille du Scroller à  0. Mais, ça me parait trop barbare.
    Donc, j'espère qu'il y a une solution à  tous ça...

    Merci beaucoup, en tout cas, schlum ;) .
  • schlumschlum Membre
    janvier 2008 modifié #11
    - (BOOL)autohidesScrollers

    ?

    - (void)setRulersVisible:(BOOL)flag

    ?

    - (void)setHasVerticalRuler:(BOOL)flag

    ?
  • TchouboudouTchouboudou Membre
    20:55 modifié #12
    Non, les Rulers, c'est autre chose, et le autoHidesScroller c'est pour cacher les Scrollers quand le contenu est inférieur ou égal à  la NSScrollView, mais ils apparaissent quand le contenu est plus grand.
  • schlumschlum Membre
    janvier 2008 modifié #13
    Mais au fait, quelque-chose me tarabuste là ...
    NSTextView n'a pas besoin d'être incluse dans une NSScrollView
    Elle gère déjà  son propre scroller  ??? (formée d'une NSScrollView et d'un NSText)
  • TchouboudouTchouboudou Membre
    20:55 modifié #14
    Mmmm intéressant tout ça... Merci

    Malheureusement, j'ai viré la création du NSScrollView, mais ça scroll toujours pas (et en plus, maintenant, ça commence en bas). Aussi, je sais pas quelle taille donner au NSTextView, sachant que la taille de la chaà®ne ([string size].height) sera plus grande que ce que je veux...
  • TchouboudouTchouboudou Membre
    20:55 modifié #15
    Il s'avère que quand l'on crée un NSTextView avec IB et que l'on enlève les Scroller (mais que ça scroll toujours quand même avec la molette), il y a d'abord une NSScrollView, puis une NSClipView et une NSTextView.
    J'ai essayé de faire la même chose, aucun problème, sauf que ça ne scroll toujours pas :'(
  • schlumschlum Membre
    20:55 modifié #16
    Oui j'ai dit des bêtises, c'est pas NSText, mais bien NSTextView...
    Interface Builder fait sa toutouille.
  • schlumschlum Membre
    20:55 modifié #17
    Suffit de faire un "setHasVerticalScroller:NO" sur le scroller... NSTextView est capable de gérer son défilement (à  moins que ça ne soit NSClipView).
  • TchouboudouTchouboudou Membre
    20:55 modifié #18
    Quand je faisais une NSTextView incrustée dans une NSScrollView, je mettais setHasVerticalScroller:NO, ça ne marchait pas.
    Maintenant, si je mets simplement une NSTextView, je peux pas accéder à  ça NSScrollView.
  • BruBru Membre
    20:55 modifié #19
    dans 1199302706:

    J'ai essayé de faire la même chose, aucun problème, sauf que ça ne scroll toujours pas :'(


    Pourquoi ne pas créer ton textlView via IB ?
    Un textView est un objet assez complexe, donc, fais confiance en IB.

    Le plus simple, créé un nouveau nib, insére un custom-view dans lequel tu vas déposer ton textView idéal (avec la bonne config).

    Ainsi, à  chaque fois que tu dois créer un textView, au lieu des alloc/init, tu charges le fichier nib, ce qui va automatiquement créer le textView.

    .
  • TchouboudouTchouboudou Membre
    20:55 modifié #20
    Bon, ça me gonflait un peu toutes ces vues qui veulent pas marcher... J'ai tout créé sur IB et ça marche nikel... J'ai juste un peu plus d'outlets... Mais c'est pas grave.

    Merci à  tous, en tout cas  :-*
  • schlumschlum Membre
    20:55 modifié #21
    C'est quand même bizarre qu'on arrive pas à  la créer à  la main...
    J'ai essayé aussi l'imbrication NSScrollView / NSClipView / NSTextView
    En définissant bien les "setContentView" et "setDocumentView"
    Et nada...

    En traçant avec la solution IB, ça donne ça :
    TextViewBT.png

    En créant avec le code, ça bloque à  [NSClipView _scrollTo:animate:] qui ne repasse pas la main à  NSScrollView

    @implementation MyWindow<br /><br />- (void)awakeFromNib<br />{<br />	NSRect r1 = [[self contentView] bounds];<br />	NSRect r2 = NSMakeRect(0,0,r1.size.width,2*r1.size.height);<br />	<br />	NSScrollView *scrollView = [[NSScrollView alloc] initWithFrame:r1];<br />	[scrollView setHasVerticalScroller:NO];<br />	[scrollView setHasHorizontalScroller:NO];<br />	[scrollView setDrawsBackground:NO];<br />	[scrollView setBorderType:NSNoBorder];<br />	<br />	NSClipView *clipView = [[NSClipView alloc] initWithFrame:r1];<br />	<br />	NSTextView *textView = [[NSTextView alloc] initWithFrame:r2];<br />	[textView setDrawsBackground:NO];<br />	[textView insertText:[NSString stringWithCString:&quot;a&#092;nb&#092;nc&#092;nd&#092;ne&#092;nf&#092;ng&#092;nh&#092;ni&#092;nj&#092;nk&#092;nl&#092;nm&#092;no&#092;np&#092;nq&#092;nr&#092;ns&#092;nt&#092;nu&#092;nv&#092;nw&#092;nx&#092;ny&#092;nz&quot;]];<br />	[textView setEditable:NO];<br />	[textView setSelectable:NO];<br />	[textView setRichText:NO];<br />	[textView setUsesFindPanel:NO];<br />	<br />	[clipView setDocumentView:textView];<br />	[scrollView setContentView:clipView];<br />	<br />	[[self contentView] addSubview:scrollView];<br />}<br /><br />@end
    
  • BruBru Membre
    20:55 modifié #22
    dans 1199308426:

    J'ai juste un peu plus d'outlets... Mais c'est pas grave.


    Un seul outlet peut suffire :
    - soit tu as l'outlet du scrollView : dans ce cas ton textView peut être atteint par [outletScrollView documentView].
    - soit tu as l'outlet du textView : un [[outletTextView superview] superview] te permet de récupérer le scrollview.

    .
  • TchouboudouTchouboudou Membre
    20:55 modifié #23
    En fait, j'ai 4 NSBox qui contiennent les mêmes trucs : 2 images, 1 bouton et 1 NSTextView. Et tout ça change (une image diffère, le texte change...). ç'aurait été plus facile en faisant une seule vue pour chaque NSBox. Mais bon, maintenant ça marche bien :) .
Connectez-vous ou Inscrivez-vous pour répondre.