scrollView qui scrolle pas

@importer@importer Membre
23:51 modifié dans API UIKit #1
Bonjour,

Dans mon appli j'ai une vue principale (mainView) qu'on flippe sur une vue de réglage (settingsView). Comme il y a pas mal de fonctionnalités, ma settingsView contient une scrollView de W: 960 H: 460 (3 imageView faisant office de subviews). Mon problème est que ça scrolle pas.
Est ce que quelqu'un pourrait me renseigner svp?j'ai déja regardé les sample Scrolling et PageControl.


Dans mon code, le .h:
@interface SettingsView : UIView &lt;UIScrollViewDelegate&gt;{<br />	IBOutlet UIScrollView *aScrollView;<br />

et le .m
-(void)awakeFromNib{<br />	aScrollView.scrollEnabled = YES;<br />	aScrollView.pagingEnabled = YES;<br />	aScrollView.clipsToBounds = YES;<br />	aScrollView.canCancelContentTouches = YES;<br />&nbsp; &nbsp; //scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages, scrollView.frame.size.height);<br />&nbsp; &nbsp; aScrollView.showsHorizontalScrollIndicator = NO;<br />&nbsp; &nbsp; aScrollView.showsVerticalScrollIndicator = NO;<br />	aScrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;<br />&nbsp; &nbsp; aScrollView.scrollsToTop = NO;<br />&nbsp; &nbsp; aScrollView.delegate = self;<br />}<br /><br />- (void)scrollViewDidScroll:(UIScrollView *)scrollView{<br />	scrollView = aScrollView;<br />}<br />

Dans IB, ma scrollView est bien bindée à  ma settingsView et les boutons de la premiere subview sont fonctionnels.

En fait ce que j'aimerai c'est que ça scroll et que je puisse mettre à  jour le pageControl en même temps. ça doit pas être bien compliqué mais quand ça veut pas ça veut pas  :(
Merci

Réponses

  • GreensourceGreensource Membre
    23:51 modifié #2
    Je ne suis pas spécialiste mais à  priori il faut que ta scrollview soit plus petite que la vue qu'elle contient. En général la taille de l'écran sans la statusBar.
    D'autre part tu sembles faire les choses à  l'envers, il faut que se soit ta settingView qui soit contenu dans ta scrollView.

    Qu'on me reprenne si je me trompe mais il me semble que c'est ça.
    Sinon j'avais fait un court tuto dessus si ça t'intéresse ici
  • @importer@importer Membre
    23:51 modifié #3
    Aà¯e Aà¯e Aà¯e, si je procède comme ça je vais en avoir pour des heures, juste pour pouvoir scroller, ça va tout foutre en l'air mon architecture. Tu es sûr que le problème vient du fait que je met ma scrollView dans une UIView et que donc c'est le fait que la UIView soit limitée en taille?
    Si j'ai pas le choix je vais utiliser que des vues et me faire mon anim (mais vraiment si j'ai pas le choix).
  • GreensourceGreensource Membre
    juillet 2009 modifié #4
    Non non ne t'inquiète pas, d'après mon expérience, les scrollview ça marche super et ça fera exactement ce que tu veux mais.. il faut savoir les maà®triser  :P
    Perso je n'en suis pas là  encore.
    Deux choses, si tu le veux, met ton projet en lien qu'on puisse le regarder. Et sinon moi perso je te conseil de faire un mini projet à  coté pour te faire la main sur un scrollview. Et troisio si tu veux faire une vue de paramètres je te conseil de faire comme Apple avec leur paramètre sur iPhone.

    ps: J'ai un doute sur ce que j'ai dit (la scrollview qui doit contenir ta settingview) car c'est ta settingview qui réceptionnera les events or pour que la scrollview puisse bouger elle doit bien recevoir les events en premier non?


    [edit] Va voir dans UITableView tu va trouver ton bonheur à  mon avis. J'ai joint une image de la doc pour illustrer
  • @importer@importer Membre
    juillet 2009 modifié #5
    dans 1247131968:

    si tu le veux, met ton projet en lien qu'on puisse le regarder.

    Bah je voudrais bien mettre le projet en lien, mais je suis en stage de fin d'études et j'ai une clause de confidentialité, en plus il sont en train de lancer l'activité et je suis le seul du coup à  faire du dev iphone (et je m'autoforme) alors c'est pas la joie.
    dans 1247131968:

    je te conseil de faire un mini projet à  coté pour te faire la main sur un scrollview.

    Tout à  fait ok pour les mini projet, je fonctionne comme ça
    dans 1247131968:

    ps: J'ai un doute sur ce que j'ai dit (la scrollview qui doit contenir ta settingview) car c'est ta settingview qui réceptionnera les events or pour que la scrollview puisse bouger elle doit bien recevoir les events en premier non?

    il me semble aussi, mais comme j'ai 1 mois d'expérience iphoe sdk, j'en suis pas sûr non plus

    Edit(h):merci, j'y cours de suite
    re-Edit(h):
    UITableView is a subclass of UIScrollView, which allows users to scroll through the table, although UITableView allows vertical scrolling only.

    arf, c'est uniquement du scrolling horizontal que je cherche. En tout cas merci pour l'idée
  • GreensourceGreensource Membre
    juillet 2009 modifié #6
    Ah bas attend je viens de voir ça dans la doc justement, à  l'instant. J'essaie de te retrouver ça!

    Sinon je confirme, ta vue settingsView dois se trouver DEDANS ta scrollView!
    [(UIScrollView*)self.view addSubview:myImage];
    

    myImage étant une ImageView mais tu dois pouvoir mettre ce que tu veux dedans. Même une vue composée de plusieurs vue.

    [edit]Je remarque aussi que tu ne set pas la taille du contenu de ta scrollview, ce qui doit-être assez important ;) Il faut faire:
    [(UIScrollView*)self.view setContentSize:CGSizeMake(myImage.frame.size.width, myImage.frame.size.height)];
    

    En gros tu as une scrollview de la taille de l'écran et tu lui dit "hey le contenu que tu va devoir afficher fait: X*Y pour toi c'est 960*460 si je comprend bien.
  • @importer@importer Membre
    23:51 modifié #7
    dans 1247133637:

    [edit]Je remarque aussi que tu ne set pas la taille du contenu de ta scrollview, ce qui doit-être assez important ;) Il faut faire:
    [(UIScrollView*)self.view setContentSize:CGSizeMake(myImage.frame.size.width, myImage.frame.size.height)];
    

    En gros tu as une scrollview de la taille de l'écran et tu lui dit "hey le contenu que tu va devoir afficher fait: X*Y pour toi c'est 960*460 si je comprend bien.

    Alors là , bah ué that's the solution in fact. En fait j'avais cette ligne dans mon code comme tu as pu le voir, dans mon premier message mais je l'avais commentée parce que j'avais setté la taille de ma scrollView dans IB. Comme quoi, même pour des réglages "basic" vaut mieux tester par le code (mais bon faut savoir justement quels réglages vont poser probleme).
    Conclusion, un grand merci, ça fonctionne.
    Et :
    dans 1247133637:

    Sinon je confirme, ta vue settingsView dois se trouver DEDANS ta scrollView!
    => ah bah apparement nan puisque ma scrollView est SUR ma settingsView(UIView).Du coup je te confirme l'inverse ;)
    En tout cas un grand merci parce que j'ai cherché une grande partie de l'aprem hier avant de poster.
    A bientôt et bon ap' (fait faim)
  • Philippe49Philippe49 Membre
    23:51 modifié #8
    Signalons le récent exemple ajouté par Apple la ScrollView Suite
  • GreensourceGreensource Membre
    23:51 modifié #9
    dans 1247135703:
    ah bah apparement nan puisque ma scrollView est SUR ma settingsView(UIView).Du coup je te confirme l'inverse ;)


    Attend c'est dingue ce truc! Tu pourrais me faire un screenshot des liaisons dans IB? Sinon je vais essayer ta technique, ça marche peut-être dans les deux cas? Etrange en tout cas.

    @Philippe, perso j'ai pas le droit de voir ce que tu veut montré ^^ Bientôt peut-être...
  • @importer@importer Membre
    23:51 modifié #10
    Hmm bah ya rien de particulier, j'ai ma view (settingsView de classe SettingsView) et le premier IBOutlet c'est ma scrollView
    Edit(h): 69Mo le truc de Philippe...jme demande ce que ça peut être, on va voir ça dans quelques secondes
  • GreensourceGreensource Membre
    juillet 2009 modifié #11
    J'arrive pas à  comprendre :P
    A quel moment, et qui vers qui tu fais addSubview? Parce que si je comprend bien dans IB, tu as ta settingView et une scrollView qui correspond à  l'IBOutlet aScrollView. Tu as juste placé ta scrollView par dessus ta settingView dans IB?

    Je vois pas comment ça peut marché si c'est pas comme sur l'image que je joint. Ou alors on s'est pas compris avec les terme "sur" et "dedans" ^^
    Ca te donne ça aussi toi?
  • AliGatorAliGator Membre, Modérateur
    23:51 modifié #12
    Attention oui à  bien utiliser la scrollView : une scrollview fait scroller ses SUBVIEWS, donc les vues qu'il contient.
    Une scrollview (faisant par exemple 320x416 pixels) contient, en subview donc, la vue à  afficher, typiquement plus grande que la scrollview (par exemple une vie de 800x600px). La scrollview va alors te permettre de faire scroller le contenu pour afficher la partie qui t'intéresse de sa subview.

    Et ce n'est pas dans l'autre sens que ça s'utilise, c'est pas une grande vue dans laquelle on place une scrollview pour faire en sorte que la grande vue soit scrollable, non non non.
  • GreensourceGreensource Membre
    23:51 modifié #13
    J'ai aussi noté quelques petites choses étrange dans ton code:
    aScrollView.showsHorizontalScrollIndicator = NO;<br />&nbsp; &nbsp; aScrollView.showsVerticalScrollIndicator = NO;<br />	aScrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
    

    Pourquoi changer le style si tu caches les barres de scroll? A moins que tu ne veuille plus tard les faire apparaà®tre?
    Et sinon il me semble que le scroll est "enabled" par défaut, ça t'évite:
    aScrollView.scrollEnabled = YES;
    
  • @importer@importer Membre
    juillet 2009 modifié #14
    Oui en effet t'as raison sur les scrollindicator j'ai pas fait gaffe, et en effet par défaut le scroll est enabled.
    Pfff bon bah ça déconne; quand je scroll ça va au delà  des limites de la scrollView et 2 secondes apres s'être arrété ça va fixer pile poil sur l'imageView2. Ensuite, une fois qu'il a bloqué sur la 2, impossible de scroller vers la 3.

    Edit(h):
    j'ai mis une tite image de l'arborescence
    ->Ali : en fait de mon côté c'est une UIView (320x460) qui contient une UIScrollView (460x960), qui contient 3 UIImageView l'une à  côté de l'autre.
    Pour toi, faut mettre des UIView à  la Place de mes UIImageView donc?
  • GreensourceGreensource Membre
    23:51 modifié #15
    Ah oui d'accord mais du coup toi ce qui va scroller c'est bien le contenu de ta scrollview (ImageView et Cie) c'est pas ta settingView.

    Il faudrait pas que tu mettes tes trois UIImageView dans une grande vue qui les contiendrais?
  • AliGatorAliGator Membre, Modérateur
    23:51 modifié #16
    Ca pourrait être plus facile d'avoir une seule vue en subview de ta scrollview. Quitte à  ce que cette vue unique ait tes UIImageViews en subview. (Donc ajouter un niveau intermédiaire, au final, quoi), en effet... ou au moins pour te familiariser avec les scrollviews.

    Après je pense qu'on peut faire sans, et garder plusieurs subviews, mais du coup faut bien renseigner la scrollview pour lui donner la taille de la vue à  scroller (un truc genre contentViewSize, je sais plus) en la calculant d'après le rectangle englobant de toutes tes subViews (voir méthodes de CGGeometry.h sur les unions et intersections de CGRect pour faire une union de tes frames de tes subviews)...

    Bref les deux sont jouables, que tu n'aies qu'une vue ou que tu en gardes plusieurs du moment que tu calcules et indiques bien la taille de la "zone virtuelle à  faire scroller"... mais à  voir laquelle sera la plus simple
  • @importer@importer Membre
    23:51 modifié #17
    désolé j'avais pas vu qu'il y avait une page 2.
    Bah j'ai rien réussi de l'apèm. ça scroll mais jusque bien au delà  des limites de taille de ma scrollView, et une fois qu'on a laché et que le scroll s'arrète, ça va fixer sur l'imageView2 (celle du mileu en fait (ya 3 imageView)) et impossible de re-scroller vers la droite.
    Donc en fait, ce que je cherche maintenant c'est que chaque scroll m'amène sur la "page" suivante, j'ai essayé en enregistrant l'origine de chaque imageView mais ça a rien donné de plus  >:(
    Sur ce bonne soirée
  • GreensourceGreensource Membre
    juillet 2009 modifié #18
    En fait ce que tu veux faire c'est ce que fait Apple avec les différente pages d'applications? Il y a un truc qui gère ça d'emblée il me semble.

    [edit] Cherche dans Modal View Controller dans la doc
  • Philippe49Philippe49 Membre
    23:51 modifié #19
    dans 1247157267:

    En fit ce que tu veut faire c'est ce que fait Apple avec les différente pages d'applications? Il y a un truc qui gère ça d'emblée il me semble.

    L'exemple PageControl
  • @importer@importer Membre
    juillet 2009 modifié #20
    Alors en mettant pagingEnabled à  NO ça s'arrete bien au limite de la scrollView, par contre j'arrive toujours pas à  faire que ça scroll que vue par vue.
  • @importer@importer Membre
    juillet 2009 modifié #21
    Que me manque t'il pour que quand je scroll ça s'arrete bien à  chaque page svp?
    <br />- (void)scrollViewDidScroll:(UIScrollView *)sender {<br />&nbsp; &nbsp; if (pageControlUsed) {<br />&nbsp; &nbsp; &nbsp; &nbsp; // do nothing - the scroll was initiated from the page control, not the user dragging<br />&nbsp; &nbsp; &nbsp; &nbsp; return;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; CGFloat pageWidth = kScrollObjWidth;//aScrollView.frame.size.width;<br />&nbsp; &nbsp; int page = floor((aScrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;<br />&nbsp; &nbsp; pageControl.currentPage = page;<br />}
    

    En fait la différence avec l'exemple PageControl (à  part le fait que eux ça marche) c'est qu'ils ajoutent explicitement des subview
  • GreensourceGreensource Membre
    23:51 modifié #22
    Bas il faudrait justement que tu set ton contentOffset au milieu de la page correspondante non?
    En gros je ferais:
    [sender setContentOffset:CGMakePoint(milieuDunePage.width*NumeroDeMaPage , milieuDunePage.height*NumeroDeMaPage]
    
  • @importer@importer Membre
    23:51 modifié #23
    dans 1247228274:

    En fait la différence avec l'exemple PageControl (à  part le fait que eux ça marche) c'est qu'ils ajoutent explicitement des subview

    J'étais en train d'éditer quand tu as posté
  • GreensourceGreensource Membre
    23:51 modifié #24
    Bas ouais moi je trouve ça mieux fait aussi d'avoir plusieurs subview, comme ça tu met ton contentOffset sur celle que tu veux. A mon avis c'est un truc du genre qui est fait par Apple.
  • @importer@importer Membre
    23:51 modifié #25
    C'est pas mal ça :
    [sender setContentOffset:CGPointMake(kScrollObjWidth*page , 0)];
    

    Le seul problème c'est que tu scroll sur plus d'un centimètre et tu te retrouve direct sur la page 3 et on a pas le temps de voir la décélération :o
  • @importer@importer Membre
    23:51 modifié #26
    Une petite idée Philippe peut être?
  • Philippe49Philippe49 Membre
    23:51 modifié #27
    Euh, j'ai pas trop suivi. Tu peux faire un état des lieux :
    • Comment sont disposées tes vues, les connections.
    • Les méthodes clés.
    • Le(s) problème(s) rencontré(s).
  • GreensourceGreensource Membre
    23:51 modifié #28
    dans 1247233175:

    C'est pas mal ça :
    [sender setContentOffset:CGPointMake(kScrollObjWidth*page , 0)];
    

    Le seul problème c'est que tu scroll sur plus d'un centimètre et tu te retrouve direct sur la page 3 et on a pas le temps de voir la décélération :o

    oui ça je m'en doutais, soit tu fait toi même une fonction qui gère l'animation soit tu trouve le truc qu'Apple utilise. Tu utilises bien les modals view? Tu dois avoir une animation quand tu changes de vue je crois.
  • @importer@importer Membre
    juillet 2009 modifié #29
    Bonjour à  tous,
    Désolé de ne pas avoir répondu plus tôt, on a fait le pont.
    Greensource, nan je n'utilise pas les modalView parce que ça prend un viewController en paramètre et que je n'utilise pas le viewController, tout est géré dans la classe SettingsView:UIView
    Voilà  la partie de code qui pose problème. J'espère vraiment que quelqu'un aura une solution parce que je sature vraiment. Merci en tous cas
    -(void)awakeFromNib{<br />	aScrollView.scrollEnabled = YES;<br />	aScrollView.pagingEnabled = NO;//un vrai carnage à  YES<br />	aScrollView.clipsToBounds = YES;<br />	aScrollView.canCancelContentTouches = NO;<br />   aScrollView.contentSize = CGSizeMake((kScrollObjWidth * (kNumberOfPages+1)), aScrollView.frame.size.height);<br />    aScrollView.showsHorizontalScrollIndicator = NO;<br />    aScrollView.showsVerticalScrollIndicator = NO;<br />    aScrollView.scrollsToTop = NO;<br />    aScrollView.delegate = self;<br />    pageControl.numberOfPages = kNumberOfPages;<br />    pageControl.currentPage = 0;<br />}<br /><br />- (void)scrollViewDidScroll:(UIScrollView *)sender {<br />    if (pageControlUsed) {<br />        return;<br />    }<br />    CGFloat pageWidth = kScrollObjWidth;<br />    int page = floor((aScrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;<br />    pageControl.currentPage = page;<br />	<br />	[sender setContentOffset:CGPointMake(kScrollObjWidth*page , 0)];<br />}<br /><br />- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {<br />    pageControlUsed = NO;<br />}<br /><br />- (IBAction)changePage:(id)sender {//interaction directe avec le pageControl<br />    int page = pageControl.currentPage;<br />    CGRect frame = aScrollView.frame;<br />    frame.origin.x = kScrollObjWidth * page;<br />    frame.origin.y = 0;<br />    [aScrollView scrollRectToVisible:frame animated:YES];<br />    pageControlUsed = YES;<br />}
    

    Quand je veux changer de vue en cliquant le pageControl il n'y a pas de problème ça change de subview comme il faut avec l'animation.
    Les problèmes: En scrollant depuis la scrollView un trés léger déplacement (0.5cm) amène sur la 2ème subview sans animation, un déplacement trés légèrement plus long (<=1cm) amène sur la 3ème subview (la dernière) sans animation non plus mais on voit bien sur le pageControl que ça passe bien par la vue 2.

    Edit:En gros quand je scroll (je pose le doigt, je le déplace, je lâche), quand j'ai relevé le doigt c'est comme si il y avait de l'inertie et alors ça peut pas s'arréter en subview2...
    SVP HELP ME

    Re-edit:Vous pensez que je dois laisser tomber et implémenter des touchesMoved etc ou il y a une solution toute simple que je ne connais pas? Au passage, si je met pagingEnabled à  YES ça fait n'importe quoi, les limites de frame ne sont plus respectées...
Connectez-vous ou Inscrivez-vous pour répondre.