[Résolu]Affichage simple d'une image avec possibilité de Pinch to zoom

LeChatNoirLeChatNoir Membre, Modérateur
octobre 2014 modifié dans API UIKit #1

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 ?


 


Réponses

  • C'est un peu embêtant en effet ces histoire de bugs sous ios 7 alors que sous ios 8 ça fonctionne. J'ai un petit niveau donc je vais essayer d'aider comme je peux.


    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.
  • LeChatNoirLeChatNoir Membre, Modérateur

    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...


  • LeChatNoirLeChatNoir Membre, Modérateur

    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 B)


     


    Une âme salvatrice dans le coin ?


  • AliGatorAliGator Membre, Modérateur

    La UIScrollview, je lui colle 6 contraintes : centrées X,Y et marges à   0 et un maxZoom à  2.

    C'est pas surdéfini ça (sur-contraint, + de contraintes que nécessaire avec risque de conflit) ?

    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.
  • LeChatNoirLeChatNoir Membre, Modérateur

    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 !


  • LeChatNoirLeChatNoir Membre, Modérateur

    Un petit bémol cependant : j'ai 2 warning comme quoi la scrollview a une largeur et hauteur ambiguë...


  • MayerickMayerick Membre
    octobre 2014 modifié #8
    Il doit te proposer des contraintes en orange pour régler cette ambiguà¯té sur le storyboard (parfois elles sont planquées ces lignes orange). La fonction addMissingConstraints sur l'objet ou sur toute la vue est plus pratique et intelligente sous xCode 6 que sous 5, regarde si tu peux régler ça comme ça, parfois c'est bien pratique et tu peux regarder les contraintes ajoutées pour voir s'il fait de la m**** ou s'il corrige. Ou alors tu peux rectifier ça en ajoutant/supprimant des contraintes à  la main et tout tester, c'est plus long et moins fun mais tu trouveras d'où vient le conflit. Essayes de rajouter un centerX et centerY sur ton imageView et non ta scrollV pour voir et pourquoi pas les quatre marges à  0, leading, trailing, top et bottom.
  • AliGatorAliGator Membre, Modérateur
    octobre 2014 modifié #9
    Ah oui c'est vrai que tu es dans une ScrollView, et que les ScrollViews c'est un peu particulier.

    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 ?!
  • LeChatNoirLeChatNoir Membre, Modérateur

    @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...

  • Pourtant il y a bien moyen de faire.. :/ si tu ne peux pas te déplacer c'est que le contentSize est faux et peut-être l'origine.bounds de l'imageV. Essaye peut-être de le modifier dans scrollViewDidEndZooming, genre si Ios 7 et que ton image est plus grande que la taille de la scrollV, alors le contentSize est égal à  la taille de ton imageV. * scrollV.zoomScale.
Connectez-vous ou Inscrivez-vous pour répondre.