[Résolu]Affichage simple d'une image avec possibilité de Pinch to zoom
LeChatNoir
Membre, Modérateur
J'ai une UIScrollView avec dedans une UIImageView.
En autolayout, j'ai des contraintes qui permettent de faire coller l'UIImageView à la scrollView.
Je met le max zoom à 2.
Je définis mon controller comme delegate de la scrollView et je définis la méthode
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
dans laquelle je renvoie mon UIImageView.
Jusque là , rien de compliqué et tout va bien... sur iOS8...
Sur le simu iOS7 par contre, le zoom a l'air de se produire mais reviens immédiatement à sa valeur initiale ce qui se concrétise par des saccades et un zoom qui ne se fait jamais...
WTF ? Vous avez déjà eu ce problème ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Est ce que tu utilise une UIView en tant que containerView pour ton imageView ? Ca peut aider pour les contraintes... Du coup dans la méthode viewForZooming tu retourne ta container view et non directement l'imageView.
Est-ce que tu implémentes scrollViewWillBegin/DidEndZooming ? Regardes à quel moment et pourquoi le scrollV.zoomScale se modifie.
Enfin es tu certain de ton min et maxZoomScale ? Si l'image revient à son zoomScale d'origine, c'est que le min ou le max ont été dépassé, la scrollView se positionne donc à son min ou max possible.
Merci, tu m'as un peu mis sur la piste.
En fait, ma UIImageView, je lui met 4 contraintes de marges à 0 par rapport à son container (qui est la scrollView).
C'est ça qui semble poser pb sous iOS7 alors que sous iOS8, ca passe...
Bon ben je dois pas avoir compris un truc... J'implore donc votre aide
Soit une UIScrollView avec une UIImageView dedans.
La UIScrollview, je lui colle 6 contraintes : centrées X,Y et marges à 0 et un maxZoom à 2.
La UIImageView, pareil pour les contraintes.
Résultat : sous iOS8, ça roule. Sous iOS7, ça zoom mais ça revient immédiatement à 1 d'où un zoom non effectif et saccadé.
J'ai mis une "view" intermédiaire pour tenter de résoudre le pb mais j'obtiens des résultats non attendus. Genre ça fonctionne mais c'est non centré..
Il s'avère que ce sont les contraintes de marges qui génèrent ce pb. Visiblement, sous iOS8, il considère que les contraintes s'appliquent sur la contentView (ce qui parait logique) mais pas sous iOS7.
Au final, un truc qui devrait être basique et vite réglé me fait perdre les pédales et mon temps
Une âme salvatrice dans le coin ?
1) Si tu définis les 4 marges à 0, pas besoin de centrer X et Y en +
2) Ou alors si tu centres en X, tu n'as besoin que de contraindre une seule autre mesure dans la dimension horizontale (la largeur de la ScrollView, ou alors sa position/marge à gauche, ou alors sa position/marge à droite, mais pas les 2 et encore moins les 3). Et pareil pour l'axe vertical, si tu centres en Y tu n'as besoin que de contraindre en + soit la marge top, soit bottom, soit height, mais un seul des 3.
Sinon ça va être surdéfini.
Effectivement Ali. Ce que tu m'as dit m'a fait réfléchir et le point clé de cette histoire, c'est quand même la taille de l'image initiale.
Il me faut donc des contraintes de largeur et hauteur sur l'imageView, quitte à les modifier en live (via IBOutlet) pour gérer différentes taille.
J'ai donc rectifier le tir :
=> UIScrollview avec contraintes de marges à 0 (4 contraintes)
=> UIImageView avec contraintes de marge gauche et haut à 0 + contrainte de largeur et hauteur.
Et le miracle se produit
Merci !
Un petit bémol cependant : j'ai 2 warning comme quoi la scrollview a une largeur et hauteur ambiguë...
Il te faut des contraintes extérieurs sur la ScrollView pour fixer sa frame (les 4 marges que tu as mises entre la ScrollView et sa vue parente), mais il faut aussi que la taille de son contenu interne soit définie entièrement, pour qu'il puisse en déduire la contentSize.
En effet, comme une ScrollView peut contenir des vues plus grandes que sa frame (pour justement les faire scroller et naviguer dedans), la frame de la scrollview et sa contentSize ne sont pas forcément liés comme avec une vue normale et ses vues filles.
Ceci dit, je ne comprend pas trop pourquoi il te met le warning... si tu as accroché ton UIImageView en haut à gauche de ta ScrollView et que tu lui as imposé une largeur et hauteur... normalement ça devrait suffire à définir entièrement la contentSize de la ScrollView, donc pourquoi gueule-t-il ?!
@Mayerick : au début, j'avais mis des contraintes sur la UIImageView pour la centrer. Mais c'est pas bon car quand on zoom sous iOS7 : ca replace l'image au centre systématiquement donc c'est moche et on peut pas se déplacer quand on est en zoom max.
@ali : il gueule car il dit que les sous vues de la scrollView doivent couvrir les 4 bords de la scrollview. Si je comprends bien, il faudrait que j'ajoute des contraintes en bas et à gauche aussi.
Ce qui ne pose aucun pb en iOS8 car j'ai bien l'impression que ces contraintes sont rattachées à la contentView.
Mais pas sous iOS7....
JE crois que le pb est bien là en fait. sous iOS7, les contraintes sont posées entre la sous vue et la scrollView. En iOS8, entre la sous vue et la contentView...