(Réglé) Adapter la taille d'une UIScrollView à son contenu
Bonjour à tous
J'aimerais adapter la taille de ma UIScroll à son contenu.
J'ai tout de suite pensé à la propriété sizeToFit mais ça ne marche visiblement pas.
J'ai également testé ce code trouvé sur le net mais sans succès (la taille est fixe)
-(void)setContentSizeOfScrollView:(UIScrollView*)scroll
{
CGRect rect = CGRectZero;
for(UIView * vv in [scroll subviews])
{
rect = CGRectUnion(rect, vv.frame);
}
[scroll setContentSize:CGSizeMake(rect.size.width, rect.size.height)];
}
Ps: Le sujet à été supprimé, je ne sais pourquoi
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Salut,
Perso je fais un truc dans ce genre la :
ça marchouille, mais ce n'est surement pas la meilleure façon de faire ...
Car ton code s'occupe du 2e cas (de toute façon je vois pas l'intérêt d'avoir une scrollview dans le premier cas, si la vue affiche tout son contenu et que y'a plus à scroller...).
Sinon ça veut dire quoi "ça ne marche pas" ? Ca fait quoi au juste, ça adapte la contentSize mais cette dernière n'est pas bonne ? Tu peux scroller mais tu as des parties de ton contenu qui ne peuvent jamais être atteintes car tu ne peux pas scroller assez loin ? Tu ne peux pas scroller du tout ? Ca ne change rien avant/après ? C'est vague un "ça marche pas", faut être plus précis quand tu décris un problème !
Sinon de ce que je vois de ton code, il y a un cas qui n'est pas forcément bien géré, c'est si aucune des subviews n'est en (0,0). Tu fixes la contentSize à la taille de ton rectangle englobant toutes les subviews, mais si ce rectangle englobant est par exemple (100,100,500,500), tu devrais indiquer à ta scrollView que son contenu peut scroller jusqu'à 600x600 et non pas jusqu'à 500x500 !
Donc en dernière ligne, je mettrais plutôt :
Ce que je cherche c'es adapter sa ContentSize
Bah en fait quand je met uniquement
Cela ne scrolle pas
Certains éléments de ma vue ne sont pas affichés avec cette méthode (ceux se trouvant au bas de la vue).
Si je fais
Ma UIScrollView fait encore une fois une hauteur fixe de 568.0. Et j'ai préféré fixer une largeur pour que ça ne soit pas scrollable horizontalement
Ps: Désolé je ne peut visiblement pas éditer le post précédent
Bonjour,
Je n'ai toujours pas trouvé la solution par moi même et donc je reste preneur de vos différentes idées.
Merci d'avance
Normal, puisque ce n'est pas la frame de la scrollview que tu as changé, mais sa contentSize.
Je me suis mal exprimé je veut dire, que la contentSize est toujours de 568.0
Enfin c'est quand je fais:
Je viens de tester la solution proposée par Yann, et toujours le même problème, il m'affiche pas l'entièreté de la scrollView, toute une partie n'est pas affichée
Hello je bloque toujours sur ce souci.
Avez-vous des idées svp ?
Si tu avais posté dans la bonne section tu aurais peut être plus de chances, car il semblerait que ton code soit de l'iOS...
Modérateur: déplacé dans la section adéquate.
Non, parce que nous ne comprenons pas ce qui te pose problème, sachant que nous t'avons déjà expliqué comment faire.
Peut-être qu'avec une copie d'écran, nous comprendrions mieux.
Tout à fait.
A l'heure actuelle, sur certaines annonces (les plus longues), j'ai le droit à cela:
http://image.noelshack.com/fichiers/2014/19/1399295087-capture-d-ecran-2014-05-05-a-15-03-58.png
A savoir qu'il ne m'affiche pas le texte en entier, ni les boutons en dessous.
Quand l'annonce est plus courte en revanche plus aucun souci:
http://image.noelshack.com/fichiers/2014/19/1399295087-capture-d-ecran-2014-05-05-a-15-04-38.png
Ce n'est pas clair pour moi: les boutons verts doivent-ils être affichés en permanence ou non ? Si oui, alors ils ne doivent pas être mis dans la scroll view.
Oui ils doivent être affichés en permanence, mais en dessous la description de l'article vendue, d'où le fait qu'ils soient dans la UIScrollView (c'est dans la cahier des charges que j'ai reçu, je ne peut pas faire autrement)
Bon, donc en fait il ne sont pas affichés en permanence, puisqu'il faut faire défiler la scrollview.
Je pense donc que l'exemple donné dans la première image ne va pas parce qu'on ne peut pas défiler assez pour voir ces boutons.
Dans ce cas, ça se règle bien en travaillant sur le contentSize de la scrollview. La question est pourquoi le rectangle englobant de toutes les subviews est faux.
Je comprend pas trop le problème, je ne vois aucun souci avec les captures sus-postées.
Si ton annonce est trop longue, forcément tes boutons étant à la fin de ton long texte d'annonce ne vont pas être visible tant que tu ne scrolles pas. Et évidemment, si tu scrolles pour faire défiler ton annonce, tu vas retrouver tes boutons à la fin, non? Ou alors c'est justement ça qui ne marche pas, tu aimerais pouvoir scroller mais le scroll ne fonctionne pas ?
@Céroce: Oui on ne vois ni ces boutons, ni la suite (ou la fin) de la description de l'article vendu.
Comment ça le rectangle est faux ?
J'ai fait ça pour info:
@AliGator: Le souci c'est que la 1ère capture que tu vois, représente le bas de l'UIScrollView, donc il manque clairement du contenu. Tel que dans la capture n°1, même en "forçant" le scroll (en tirant pour voir le bas), je ne vois même pas les boutons
Remplacer self.view par self.scroll ne change absolument rien au souci.
La taille a même été réduite à 426.00
Bon j'ai fait ça:
Cela me renvoie ça et 17 fois
Ce qui explique donc le résultat que tu as.
(Ne connaissant pas ta hiérarchie de vues dans ta scrollview, on ne peut pas débuguer pour toi et savoir si ces subviews sont celles attendues ou pas, etc. Par exemple je ne vois pas de UIButton dans la liste des subviews qui sont parcourues, mais elles sont peut-être elles-même en subviews d'une UIView, mais ça sans boule de cristal et sans ton projet, nous on peut pas deviner)
Les "boutons" sont en réalité des images sur lesquels je fais ça
Bon finalement j'ai trouvé mon erreur
Je mettais ce code au début du viewDidLoad alors que je créais du contenu dedans, forcément une fois mis à la fin de la fonction ça marche beaucoup mieux.
C'est à toi de creuser car toi seul connaà®t ta hiérarchie de vue et les positions (frames) attendues de ces vues donc toi seul saura dire si ce log correspond à ce que tu as dans ton XIB vu que nous on ne l'a pas sous les yeux (et on ne sait pas ce que tu fais à coté, si tu changes les frames par code, les autoresizingMasks ou contraintes positionnées... on peut pas deviner sans être devant ton projet)
Quand je vois les frames affichées dans ton log le résultat que tu obtiens me semble tout à fait logique. Donc soit tu as des vues qui ne sont pas encore en subviews au moment où tu appelles ce code et donc elles ne sont pas prises en compte car n'existent pas à ce moment là , soit tu appelles ton code alors que tes vues ne sont pas encore à leur frame/position finale... à toi de creuser, mettre des break points et des logs et surtout comparer ces frames avec ce que tu attends.
Bon visiblement tu as répondu à mon message avant édition ^^
Je disais donc après édition que j'ai finalement trouvé la solution et donc réglé le souci
Non seulement c'est compliqué, mais tu perds une fonctionnalité: quand on appuie sur l'image, elle ne change pas d'état. Le feedback est quelque chose de très important.
Comment ça elle ne change pas d'état ?
Je comptais faire un booléen, pour l'image de favori, afin de savoir si elle est en favori (1) ou non (0)
Sinon y a le UIBouton qui fait ça aussi, il fait l'état repos ou non et sélectionné ou non. Du coup il gère sans se fatiguer le fait que la personne est en train de cliquer dessus ou non et le fait de savoir si l'objet est en favoris ou non et ceci en écrivant deux lignes de codes que tout le monde a déjà testé des centaines de fois. Tu es un peu en train de réinventer la roue. Après ta solution marchera, y a pas de souci.