Vectoriel : besoin de conseils

LeChatNoirLeChatNoir Membre, Modérateur
novembre 2012 modifié dans API UIKit #1
Salut !



Je suis en train de cogiter sur le futur de mon appli.

Comme certains le savent, ClimbingAway est un annuaire des sites d'escalade du monde entier.



Ce que nous n'avons pas, ce sont les topos. Les topos, ce sont des descriptions des secteurs sur un site d'escalade, avec pour chaque secteur, les voies, leurs cotations, etc...



En France, nous nous interdisons pour l'instant de fournir ces topos d'un point de vue éthique. En effet, les topos sont rédigés par les équipeurs et c'est leur gagne pain.



Par contre, en espagne, la philosophie est différente et la plupart des topos sont gratuits. Donc je réfléchis à  un système permettant de les gérer dans l'appli.



La plupart du tps, un topo ressemble à  ça : http://daniandrada.b...01_archive.html



Je vois plusieurs problèmes ici :

=> une image en fond : lourd en poids et n'apporte pas grand chose...

=> les infos en sur-impression, lorsquelles sont incluent dans l'image, sont pas très lisibles.



image/xd-laugh.gif' class='bbc_emoticon' alt='xd' /> ! Idée ! image/xd-laugh.gif' class='bbc_emoticon' alt='xd' />

"L'autre" plupart des topos image/smile.png' class='bbc_emoticon' alt=':)' /> ressemblent à  ça : http://www.escalade-...topo_vovray.htm



Et là  ! Tilt ! Je me dit : "Voilà  ce qu'il faut faire !"

Du vectoriel !



Ca pèsera rien du tout et ça sera facile à  afficher.



Mais voilà . Comment ?



J'ai trouvé des classes pour facilement lire du SVG et l'afficher sur écran sous iOS. Mais pas d'interactivité là  dedans...



Je cherche donc un moyen :

=> de retracer facilement en vectoriel et schématiquement, un topo

=> d'indiquer sur les lignes des voies que la zone est "touch sensitiv"

=> si l'utilisateur "tap", ça affiche le détail de la voie.



Je pensais au début à  Illustrator pour "fabriquer" les topos mais l'aspect "zone sensibles" ne pourra pas être géré...

Du coup, je me dit qu'il va peut être falloir que je me fabrique une appli pour ça mais ça me parait compliqué.



Je vous expose donc tout ça pour voir si l'un d'entre vous a une idée plus lumineuse...



Merci ! Désolé de la longueur du post... image/ph34r.png' class='bbc_emoticon' alt='' />
«1

Réponses

  • Une idée : trouver bricoler une classe qui lit et affiche du SVG pour que les touches sur les zones sensibles du SVG soient capturées par la classe, et que ça devienne des actions-target.
  • Bah à  80% c'est une application de dessin vectoriel que tu dois faire ici...



    Tu peux peut être jeter un coup d'oe“il sur les projets Open Source de ce type pour voir comment faire.
  • 'jpimbert' a écrit:


    Une idée : trouver bricoler une classe qui lit et affiche du SVG pour que les touches sur les zones sensibles du SVG soient capturées par la classe, et que ça devienne des actions-target.




    Bonjour,



    Pour le SVG tu peut partir de SVGKit



    Voir https://github.com/SVGKit/SVGKit
  • LeChatNoirLeChatNoir Membre, Modérateur
    merci pour vos réponses.

    Effectivement, ça risque d'être complexe à  mettre en oeuvre...



    Mais... c'est ça qui est bon non ?

    image/grin.gif' class='bbc_emoticon' alt=';D' />
  • LeChatNoirLeChatNoir Membre, Modérateur
    hmmmm. A vue de code, j'ai bien l'impression que cette classe gère les "touch"...

    Miam image/smile.png' class='bbc_emoticon' alt=':)' />
  • SVGKit c'est bon. Mangez-en!

    Plus sérieusement, je suis intéressé par ton retour d'expérience, ayant un projet qui aura des besoins similaires.
  • LeChatNoirLeChatNoir Membre, Modérateur
    No problem. I'm always feeding back image/cool.gif' class='bbc_emoticon' alt='8--)' />
  • LeChatNoirLeChatNoir Membre, Modérateur
    Je reviens un peu sur mes besoins. Car j'ai l'impression que le vectoriel est un peu too much....



    En fait, je veux faire un peu comme les itinéraires dans "Plans".



    En gros : j'ai une image de fond (qui peut être une photo) ; ce sera une simple bitmap.

    En surimpression, je viens coller les voies.

    Et quand on touch une voie, elle réagit.



    Comme les itinéraires 1/2 dans plan en fait....

    Je sais pas vraiment comment c'est implémenté...
  • LeChatNoirLeChatNoir Membre, Modérateur
    Bon alors voilà . Je reviens pour les feedbacks (sous la menace des crocs d'Ali image/kiss.gif' class='bbc_emoticon' alt=':-*' /> ).



    Concernant SVGKit, la branche "officielle" de github me semble à  l'abandon... Le seul gars qui répond, c'est un gars qui a fait un fork et ce fork s'éloigne bcp de la branche initiale...



    J'ai tenté de l'utilisé puisque le gars semble actif (je parle de la branche adamgit). Passé les pb de compilation, j'ai commencé par me heurter à  un problème de parsing qu'il a rapidement corrigé.



    Ensuite, dans mon utilisation, je dois pouvoir :

    => conserver des layers par vecteurs (pour gérer des animations et/ou événements)

    => agrandir/réduire la frame de mon SVG (en fonction des écrans et iPhone/iPad)

    => détecter les "touch"



    Le Kit propose 2 approches pour gérer l'affichage du SVG :
    • SVKFastImageView : charge le SVG comme une image. Pas d'animation ni de "touch" possible mais dimensionnement possible.
    • SVKLayeredImageView : charge le SVG en conservant les vecteurs (un vecteur = un layer) donc touch et animations possibles. Par contre, redimensionnement : nada :-(




    Pour le redimensionnement, vu comme j'ai galéré à  intégrer le truc, j'ai voulu insister un peu et voir avec lui pourquoi ce n'était pas possible. Il m'a juste répondu qu'il n'y arrivait pas et que si je voulais améliorer le truc, je pouvais y aller ^^



    C'est là  qu'Ali est entré en jeu car je l'ai appelé au secours... Et bien sûr, Ali m'a carrément bien aidé et on a résolu le pb en 2/2... Seulement, voilà , le gars dit que notre solution casse les transformations 3D car on utilise sublayerTransform...



    Bon, au final, je pense que je vais utiliser cette version de SVGKit mais je me demande si je n'aurai pas dû aborder le pb autrement...



    Quant à  l'utilisation de SVGKit, vous l'aurez compris, disons que c'est pas mal comme framework, mais réservé à  des utilisateurs avertis...



    C'est quand même dommage que les SVG soient pas nativement supportés sous iOS...
  • FKDEVFKDEV Membre
    janvier 2013 modifié #11
    J'imagine que tu as pensé à  a bête solution du PDF clickable.

    Tu pourrais creer des PDF contenant du vectoriel et des liens (CGPDFContextSetURLForRect) en utilisant la librairie SVG que tu as trouvée avec le simulateur iOS ou les API Mac. Ensuite tu n'aurais plus qu'à  distribuer les PDF. Les URL seraient des schemes custom pour s'ouvrir dans ta propre app (à  verifier, ou tu pourrais les intercepter avec un peu plus de code).

    Je crois avoir lu que si tu utilises des fonctions de dessins basiques, le PDF créé sera vectoriel.

    Si tout ca fonctionne, il reste le soucis que les hotspots seront rectangulaires.
  • C'est drôlement puissant les vecteurs. Un gosse de 15 ans viens de les utiliser pour réfuter la théorie de la Relativité !
  • J'suis intéressé par les vecteurs. Merci du feedback.
  • LeChatNoirLeChatNoir Membre, Modérateur
    euh... en fait, non, je n'y ai pas pensé image/ph34r.png' class='bbc_emoticon' alt='' />



    Mais le point que tu soulèves est effectivement problématique...



    Les voies sont en générale bien verticales et le "hit" test de CALAyer ne donne pas une expérience utilisateur satisfaisante....

    Pour chaque voie, j'ajoute donc une "shape" qui va largement couvrir la voie. Ces shapes sont sans couleur donc ne se voient pas. Par contre, ce sont elles qui vont détecter le touch.



    De cette manière, je contrôle plutôt bien le découpage et les évènements et surtout, la distinction de voies qui démarrent au même endroit par exemple...



    Alors après, je ne suis pas fermé aux PDF et suis bien conscient que pour l'heure, la solution vers laquelle je me dirige apparait encore un peu "bancale" ; tout du moins, faite de bric et de broc...



    PS : Draken, je suis un visionnaire ! Je savais que les vecteurs étaient puissants sans soupçonner une seule seconde qu'ils pouvaient réfuter E=MC2 image/biggrin.png' class='bbc_emoticon' alt=':D' />
  • DrakenDraken Membre
    janvier 2013 modifié #15
    'LeChatNoir' a écrit:




    PS : Draken, je suis un visionnaire ! Je savais que les vecteurs étaient puissants sans soupçonner une seule seconde qu'ils pouvaient réfuter E=MC2 image/biggrin.png' class='bbc_emoticon' alt=':D' />/>/>/>


    Le gosse de 15 ans qui a écris un petit programme en Python pour modéliser la trajectoire d'un groupe de galaxies naines à  partir d'observations astronomiques ne s'attendait pas non plus à  trouver un résultat non conforme avec la Relativité. Cette histoire fait du buzz dans les milieux scientifique depuis quelques jours, aprés la parution d'un article dans la revue scientifique Nature.



    Le dessous de l'histoire c'est qu'un astrophysicien anglais travaillant à  l'observatoire de Strasbourg a fait suivre à  son fils un stage sur l'utilisation du langage Python. Le rejeton a alors bricolé un utilitaire pour aider son pére dans son étude des galaxies naines gravitant autour d'Androméde, une galaxie voisine de la nôtre. Découvrant que la trajectoire de ces galaxies est très étrange, le papa a écris un article dans l'une des plus célèbres revues scientifiques, créditant son fils dans la liste des contributeurs de la découverte. Plutôt sympa, je trouve !
  • Un autre problème avec le PDF, c'est que c'est un peu statique quand même, je ne sais pas si tu peux faire un retour sympa à  l'utilisateur quand il a tappé un lien.



    Sinon, tu as une autre solution relativement simple à  évaluer c'est le HTML5+UIWebview.



    Le HTML 5 est censé géré les SVG, non ? Safari gère les balises canvas, je n'ai jamais testé les balises svg.

    Là  tu peux avoir des événements et changer l'apparence en dynamique.
  • LeChatNoirLeChatNoir Membre, Modérateur
    oép.

    Le HTML5 gère le svg...

    Mais je n'ai pas exploré cette piste parce que le HTML5, ça me fait penser à  des murs dont la peinture ne serait pas encore sèche ^^
  • [font=helvetica, arial, sans-serif]Bonsoir,[/font]



    [font=helvetica, arial, sans-serif]Je suis nouveau sur cocoacafe (et dans le dev iOS). [/font]

    [font=helvetica, arial, sans-serif]Je tente en ce moment de faire une petite appli de géolocalisation. [/font]

    [font=helvetica, arial, sans-serif]J'ai un fichier KML que j'ai converti en SVG (précision : je ne souhaite pas afficher le fichier KML dans une MapView car la MapView, en affichant le fichier KML, affiche aussi la carte de l'endroit en dessous ce que je ne souhaite pas).[/font]



    [font=helvetica, arial, sans-serif]J'aimerai utiliser ce SVG dans une scrollView et pouvoir appliquer des animations dessus (une rotation par exemple lorsque l'utilisateur pivote sur lui-même). L'image devra également être interactive avec des points d'intérêts ajoutés sur l'image.[/font]

    [font=helvetica, arial, sans-serif]Après avoir recherché les frameworks existants sous iOS pour la gestion des SVG, j'ai arrêté mon choix sur SVGKit.[/font]



    [font=helvetica, arial, sans-serif]Ce que j'ai fait jusqu'à  présent en partant de la branche officielle de SVGKit me donne le résultat suivant : mon SVG est interactif avec l'ajout de POI, redimensionnable, scrollable mais je ne peux pas l'animer.[/font]



    [font=helvetica, arial, sans-serif]Je me suis donc penché sur le fork suivant : https://github.com/S...t/tree/2013base qui propose les deux approches décrites par LeChatNoir ci-dessus à  savoir :[/font]

    [font=helvetica, arial, sans-serif]" • SVKFastImageView : charge le SVG comme une image. Pas d'animation ni de "touch" possible mais dimensionnement possible.[/font]

    [font=helvetica, arial, sans-serif]• SVKLayeredImageView : charge le SVG en conservant les vecteurs (un vecteur = un layer) donc touch et animations possibles. Par contre, redimensionnement : nada :-( "[/font]



    [font=helvetica, arial, sans-serif]J'ai vu dans la discussion suivante : https://github.com/a...omment-11758401 que LeChatNoir et AliGator ont apporté des modifications à  la classe SVKLayeredImageView en changeant la méthodeinitWithSVGKImage et en ajoutant la méthode setFrame. Ces modifications rendaient le SVG redimensionnable lors d'une rotation du device si j'ai bien compris (ça devrait marcher dans une scrollView aussi j'imagine ?).[/font]



    [font=helvetica, arial, sans-serif]J'ai modifié en conséquence la classe chez moi mais j'ai un soucis : lors d'un redimensionnement par zoom l'image devient floue.[/font]

    [font=helvetica, arial, sans-serif]Ma question est à  la suivante : où et comment dois-je changer le frame du contentView de ma scrollView (l'image du contentView correspond à  mon SVG) pour que l'image reste nette après un zoom/dezoom ?[/font]



    [font=helvetica, arial, sans-serif]Dans le code de la méthode scrollViewDidEndZooming ? ou de viewForZoomingInScrollView ?

    J'ai fait quelques essais ici et là  sans succès : à  chaque redimensionnement, mon image vectorielle devient floue... (par contre les animations fonctionnent bien... mais ces flous c'est juste horrible!)

    Un tout petit exemple (j'essaye pour le moment de faire ça dans la démo du fork : demo-iOS) pourrait me permettre de faire un bond de géant dans mon projet !!
    [/font]



    [font=helvetica, arial, sans-serif]Par avance merci ![/font]
  • Présentation ?


  • Présentation... du code ?




    Les modifications apportées au fichier SVGKLayeredImageView.m sont les suivantes (cf https://github.com/adamgit/SVGKit/issues/25#issuecomment-11758401):



    Modification de la méthode d'init :

    - (id)initWithSVGKImage:(SVGKImage*) im

    {

    if( im == nil )

    {

    NSLog(@[%@] WARNING: you have initialized an [%@] with a blank image (nil). Possibly because you're using Storyboards or NIBs which Apple won't allow us to decorate. Make sure you assign an SVGKImage to the .image property!", /size][/color][color=#B818A3][size=3]self[/size][/color][color=#000000][size=3] [/size][/color][color=#420C81][size=3]class[/size][/color][color=#000000][size=3, /size][/color][color=#B818A3][size=3]self[/size][/color][color=#000000][size=3] [/size][/color][color=#420C81][size=3]class[/size][/color][color=#000000][size=3);

    }





    self = color=#b818a3]super[/color] [color=#420c81]init[/color;

    if (self)

    {

    ((SVGKLayer*) self.layer).SVGImage = im;

    self.layer.anchorPoint=CGPointMake(0, 0);



    self.frame = CGRectMake( 0,0, im.CALayerTree.frame.size.width, im.CALayerTree.frame.size.height ); // default: 0,0 to width x height of original image


    self.backgroundColor = /color]UIColor[color=#000000] [/color][color=#420c81]clearColor[/color][color=#000000;


    }

    return self;


    }



    Et ajout de la méthode setFrame :

    -(void)setFrame:(CGRect)frame {

    CGFloat ratioX=1,ratioY=1;

    if (frame.size.width!=self.image.size.width && self.image.size.width>0)

    ratioX=frame.size.width/self.image.size.width;

    if (frame.size.height!=self.image.size.height && self.image.size.height>0)

    ratioY=frame.size.height/self.image.size.height;



    if (ratioX!=1 && ratioY!=1) {

    NSLog(@ratioX : %f, ratioY: %f,ratioX,ratioY);


    self.layer.sublayerTransform=CATransform3DMakeScale(ratioX, ratioY, 1);

    }

    [super setFrame:frame];

    }



    L'init est faite dans la méthode loadResource du fichier DetailViewController du projet demo :

    self.contentView = [[/color][color=#538187]SVGKLayeredImageView[/color][color=#000000] [/color][color=#420C81]alloc[/color][color=#000000 initWithSVGKImage:document] autorelease];



    La méthode viewForZoomingInScrollView par défaut fait ceci :

    -(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)finalScale

    {

    view.transform = CGAffineTransformIdentity; // this alters view.frame! But *not* view.bounds


    view.bounds = CGRectApplyAffineTransform( view.bounds, CGAffineTransformMakeScale(finalScale, finalScale));


    [view setNeedsDisplay];




    self.scrollViewForSVG.minimumZoomScale /= finalScale;

    self.scrollViewForSVG.maximumZoomScale /= finalScale;

    }





    et la méthode scrollViewDidEndZooming :

    -(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)finalScale

    {

    view.transform = CGAffineTransformIdentity; // this alters view.frame! But *not* view.bounds


    view.bounds = CGRectApplyAffineTransform( view.bounds, CGAffineTransformMakeScale(finalScale, finalScale));


    [view setNeedsDisplay];


    self.scrollViewForSVG.minimumZoomScale /= finalScale;

    self.scrollViewForSVG.maximumZoomScale /= finalScale;

    }



    Où modifier le frame du contentView ? Avec quelle valeur ?



    Merci !
  • Et non, Larme voulait dire que c'est ton premier post, et dans ce cas il est de coutume de se présenter dans la section adéquate, c'est ici. Le but est que l'on sache un peu ce que tu as comme bagage... Formation, langages maitrisés, POO...
  • Toutes mes excuses, j'ignorais tout de cette coutume image/smile.png' class='bbc_emoticon' alt=':)' />

    Je me suis donc présenté là  : http://forum.cocoacafe.fr/topic/10192-bonsoir-tout-le-monde/
  • LeChatNoirLeChatNoir Membre, Modérateur
    Salut,



    Alors alors... Je me suis remis là  dessus (j'ai dû m'interrompre un certain temps).

    Je n'avais pas implémenté le zoom jusqu'à  présent.

    Je vient de le faire en indiquant juste à  ma scrollView quelle vue il doit resizer (je lui indique ma vue qui embarque et mon image de fond et mon SVG). Résultat des courses, ça zoom et ça fonctionne.



    Par contre, effectivement, ça floute... Preuve que les layers ne sont pas redessiner en fin de zoom...

    Je me demande si c'est pas une volonté de SVGKit pour garantir les perfs...



    Dans mon cas, c'est pas gênant. Cf. copies écran.

    Par contre, je comprend que ça puisse être génant... Le SVG est justement fait pour ça ^^
  • Zut ! Merci quand même ChatNoir !



    Je fais le même constat chez moi, le zoom fonctionne... mais ça floute. Sur un iPad c'est moche...

    Avec le framework officiel de SVGKit, le zoom fonctionne sans floutage. Par contre impossible de faire des animations comme cela est fait dans le fork AdamGit.

    Je pensais qu'avec les modifications que vous aviez apportées à  la classe SVGKLayeredImageView de ce fork, je pourrais avoir le beurre et l'argent du beurre ! Le redimensionnement net et les animations mais non...

    Quelqu'un aurait-il une idée pour rendre cela possible ?



    Autre solution pour moi (qui serait idéale) : pouvoir utiliser des fichiers KML dans une MapView pour afficher mes plans sans avoir de fonds de carte Google et pouvoir ainsi visualiser mes plans (et seulement mes plans) en mode offline.



    A priori c'est impossible en utilisant une MkMapView : http://stackoverflow.com/questions/4151496/hiding-an-mkmapview

    Je cite :

    [font=Arial,]"When you are using MKMapView your are under Google Earth Api terms and conditions, so there is no chance of hiding, removing or stoping the Map being loaded from Google earth. You will not be able to find any property in MapKit to disable the maps being loaded."[/font]



    Quelqu'un saurait-il faire cela autrement qu'avec une MkMapView ?



    Merci image/smile.png' class='bbc_emoticon' alt=':)' />
  • LeChatNoirLeChatNoir Membre, Modérateur
    ben maintenant, je veux dire, sous iOS6, tu es plus sous les conditions de Google mais d'Apple :-)

    Mais bon, c'est pareil, les fonds de cartes s'afficheront...
  • Oui c'est pareil... même combat image/sad.png' class='bbc_emoticon' alt=':(' />

    J'ai fait pas mal de recherches sur Google mais j'ai fait chou blanc jusqu'à  maintenant...
  • Bonsoir. Petit up au cas où quelqu'un aurait une idée pour :

    - ou [font=helvetica, arial, sans-serif]pouvoir utiliser des fichiers KML dans une MapView pour afficher mes plans sans avoir de fonds de carte Google ou Apple (depuis iOS 6) et pouvoir ainsi visualiser mes plans (et seulement mes plans) en mode offline[/font]

    [font=helvetica, arial, sans-serif]- ou solutionner mon problème avec SVGKit qui est exposé ci-dessus.[/font]



    [font=helvetica, arial, sans-serif]Merci ![/font]
  • 'Lemak' a écrit:


    - ou [font=helvetica, arial, sans-serif]pouvoir utiliser des fichiers KML dans une MapView pour afficher mes plans sans avoir de fonds de carte Google ou Apple (depuis iOS 6) et pouvoir ainsi visualiser mes plans (et seulement mes plans) en mode offline[/font]




    Tu peux toujours utiliser des overlays pour "cacher" les cartes originales.

    Il y a des samples Apple pour la lecture de fichier KML et pour créer des overlays custom.
  • Merci pour l'idée FKDev.

    C'était l'une des solutions proposées dans le lien que j'ai donné plus haut : http://stackoverflow.com/questions/4151496/hiding-an-mkmapview



    [font=Arial,]

    "I will sugest you can draw a very big polygon with the the help of MKOverlay above the google map and try to overlay your custom map above it so that the google map will be hidden by the the very big polygon and your custom maps and annotations will be present.
    [/font][font=Arial,]

    It may not be a good idea. But its a trick that can workout."
    [/font][font=Arial,]

    La réponse de la personne à  qui a été proposée cette solution :[/font][font=Arial,]

    "So the issue here is that using MKOverlay still takes significant time to draw to the screen. During this time, the user can usually see the underlying Google map - What I would like is to prevent the user from ever seeing it in the first place."[/font][font=Arial,]

    Et c'est aussi ce que je pense.[/font][font=Arial,]

    J'avais dans l'idée qu'une autre classe que MkMapView permettrait peut-être de désactiver l'affichage d'une carte (ou la masquer) sans perte de performances ?![/font]
  • FKDEVFKDEV Membre
    janvier 2013 modifié #30
    Tu pourrais aussi essayer d'intercepter les appels aux serveurs de carte d'Apple via AliSoftware/OHHTTPStub. Mais c'est encore un hack un peu tordu et, en plus, je suppose qu'il y a un cache global pour les cartes Apple.



    En fait la méthode propre ce serait d'utiliser un autre système d'affichage pour la carte.

    Par exemple routeme. C'est ce que j'utilise dans une app pour afficher une carte de France custom stockée en local sur l'iPhone.

    Je pense qu'on s'éloigne un peu du sujet initial (affichage svg) cela dit, il faudrait peut-etre ouvrir un nouveau sujet.
  • LemakLemak Membre
    janvier 2013 modifié #31
    Merci.

    L'utilisation d'un tel hack avec une MkMapView peut être, je suppose, une cause de rejet de l'application.

    Je vais essayer de creuser la piste du hack avec routeMe.



    Je suis preneur de tout retour d'expérience si quelqu'un s'est déjà  penché sur ce problème image/rolleyes.gif' class='bbc_emoticon' alt='::)' />
Connectez-vous ou Inscrivez-vous pour répondre.