[Résolu] Intégrer le "cocoacontrol" RSColorPicker

Alf1996Alf1996 Membre
mars 2013 modifié dans Objective-C, Swift, C, C++ #1
Bonsoir,

La question a peut-être été déjà  posée (c'est même plus que probable), mais je ne dois pas utiliser les bons mots pour ma recherche sur le forum, car je n'ai pas trouvé mon bonheur ! (ni ici, ni sur StackOverflow)

En fait, je souhaiterais intégrer un UIColor Picker dans mon application (RSColorPicker sur GitHub), et je cherche comment m'y prendre (je n'ai pas encore intégré d'objets autres que ceux fournis par Apple) image/baby.gif' class='bbc_emoticon' alt=' :o ' />

Dois-je copier bêtement le code qui est téléchargeable sur GitHub, et inclure ces classes (.h et .m) directement dans mon projet ? ou dois je importer un binaire ?

Si j'importe le code, je suppose que je dois laisser le texte de copyright...

Ensuite, je pense qu'il me faudra déclarer un delegate et les méthodes associées ; pour ce point, je crois que je devrais m'en sortir.



Bref, je ne sais pas comment m'y prendre, et comme je souhaiterais faire un truc propre, j'ai besoin de vos conseils...

Merci d'avance image/implore.gif' class='bbc_emoticon' alt=' o:) ' />
«1

Réponses

  • AliGatorAliGator Membre, Modérateur
    Viens à  la session CocoaHeads de Rennes jeudi prochain c'est exactement de ça dont je vais parler ! ;-)
  • Alf1996Alf1996 Membre
    janvier 2013 modifié #3
    Oui, j'avais vu que ce sujet devais être traité jeudi... Mais malheureusement je ne sais pas encore où je serais jeudi, et il y a très peu de chance que je sois sur Rennes ! J'attendrai avec impatience la diffusion des slides, ou même la video mais là  çà  va faire long !

    En attendant, je vais essayer de faire comme je pense qu'il faut faire, et je modifierai plus tard si ma méthode n'est pas la bonne...

    Après combien de temps les vidéos sont elles publiées ? Je suppose que çà  doit dépendre de la disponibilité de Thomas, c'est bien lui qui diffuse ces infos ?





    Edit : à  quand un Cocoaheads du coté de Marseille, ou mieux Aix ?...
  • LeChatNoirLeChatNoir Membre, Modérateur
    Je sais pas comment c'est foutu mais en général, tu glisses le projet XCode du control dans ton projet à  toi (dans la section framework par exemple).

    Ensuite, dans ta target, tu ajoutes la compil' de ce projet en dépendance et dans les framework, tu dois trouver la target que tu ajoutes aussi.



    Et voilà , plus qu'à  importer les .h qui vont bien et roule ma poule image/cool.gif' class='bbc_emoticon' alt='8--)' />
  • AliGatorAliGator Membre, Modérateur
    La bonne pratique que je te conseille sous Xcode4 et que je vais présenter jeudi :



    1) Utilise un Workspace qui va te permettre de contenir plusieurs projets. Dans ce Workspace, rajoute donc le xcodeproj de ton application bien sûr, et rajoute le xcodeproj de la librairie que tu veux intégrer (RSColorPicker).

    Si RSColorPicker ne propose pas sur son GitHub de xcodeproj (ou en propose juste un qui fait une démo et donc build une application, mais pas une librairie), il est très simple de demander à  Xcode de créer un nouveau projet de type "Static Library", de supprimer les 2 ou 3 fichiers inutiles qu'il t'a rajouté, et à  la place de faire glisser les fichiers source de RSColorPicker dedans, de sorte d'avoir un xcodeproj qui va te générer une librairie libRSColorPicker.a au final



    2) A cause d'un petit bug Xcode qui surviendrait si tu faisais l'étape 3 tout de suite après, je te conseille à  ce stade de builder la librairie pour iOS Device avant de l'intégrer à  ton application. Pour cela, sélectionne le Scheme "RSColorPicker" dans le menu en haut à  gauche de la fenêtre Xcode, et la destination "iOS Device", puis de choisir "Build" dans le menu "Product".



    3) Ensuite, sélectionne le projet de ton application, va dans l'onglet "Build Phases", et dans la partie "Link Binary With Libraries", clique sur le "+" pour rajouter "libRSColorPicker.a". Cela va faire en sorte que ton application intègre la librairie libRSColorPicker.a générée par l'autre projet.



    4) Suite à  l'étape 3, tu vas voir que la référence du fichier "libColorPicker.a" a été ajouté dans ton xcodeproj de ton application.

    A cause du bug Xcode évoqué à  l'étape 2, cette librairie n'est pas référencée correctement. Donc sélectionne libRSColorPicker.a dans ton projet et dans le panneau "File Inspector" à  droite que tu changes la "Location" de "Relative to Group" ou "Relative to Project" en "Relative to Build Products", et que tu t'assures alors que le chemin relatif sous lequel la lib est référencé n'est plus que "libRSColorPicker.a" (et non pas un truc bizarre genre "../../../DerivedData/ueizoufd/Release-iOS/libRSColorPicker.a" ou du genre que tu risquerais d'avoir si tu avais sauté l'étape 2).



    Une fois que tu as fait cette dernière étape qui corrige le petit bug Xcode et qui va faire que la librairie est correctement référencée "Relative to Build Products", Xcode va alors correctement la détecter tout seul comme une dépendance implicite de ton projet, ce qui fait que même si tu fais un "clean" sur ton workspace, si ensuite tu build ton application, Xcode va détecter que ton application dépend de la librairie et donc va d'abord builder la librairie avant de builder ton appli.





    PS : au même titre que les frameworks qui sont ajoutés à  ton projet quand tu link avec un framework particulier, tu peux aller ranger la référence du fichier libRSColorPicker.a qui est ajouté au projet de ton app dans le groupe "Frameworks" ou dans un groupe de ton choix, si tu veux pour faire plus propre et pas le laisser en plein milieu de ton projet.
  • Alf1996Alf1996 Membre
    janvier 2013 modifié #6
    @LeChatNoir : Merci ChatNoir. Je m'apprêtais à  faire comme çà ... Ne te vexe pas, je vais suivre la méthode d'Ali...

    Ton prédateur préféré !



    @Ali : Merci d'avoir pris le temps de me détailler la procédure, d'autant plus que tu dois avoir ta présentation CocoaHeads à  préparer, qui plus est sur le même sujet. J'étais prête à  attendre les slides (j'avais mis çà  de côté, sur la liste des "améliorations à  faire"), et j'en apprécie d'autant plus ton post fleuve...



    Je m'en vais de ce pas suivre ce super tuto...

  • AliGatorAliGator Membre, Modérateur
    Bah comme ça tu pourras me dire si en suivant ces instructions ça marche du premier coup, et donc valider que je vais pas oublier des trucs dans ma présentation image/biggrin.png' class='bbc_emoticon' alt=':D' />
  • Pas de problème, je te dis çà  dès que j'ai terminé... Probablement demain.

    Merci encore
  • AliGatorAliGator Membre, Modérateur
    janvier 2013 modifié #9
    'LeChatNoir' a écrit:
    en général, tu glisses le projet XCode du control dans ton projet à  toi (dans la section framework par exemple).

    Ensuite, dans ta target, tu ajoutes la compil' de ce projet en dépendance et dans les framework, tu dois trouver la target que tu ajoutes aussi.
    Oui ça c'est la façon Xcode3 de faire, qui doit encore marcher mais oblige de spécifier les dépendances explicitement (tu vas me dire, avec le bug de Xcode4 qui ne référence pas correctement la lib en "Relative to Build Products" et du coup ne détecte pas les dépendances implicites à  moins de corriger la référence comme j'ai indiqué, c'est kif kif...), et qui inclus un projet dans l'autre, plutôt que de rentre les projets potentiellement indépendants et parallèles. Donc c'est valable, mais disons que ce n'est plus la façon officielle conseillée depuis Xcode4.



    Dans tous les cas je suis allé voir vite fait le GitHub de RSColorPicker et il semble que le seul xcodeproj qui soit fourni soit un Xcodeproj pour générer son application de démo (et pas un xcodeproj pour générer une librairie indépendante que tu pourras ensuite intégrer dans tes projets), donc de toute façon il te faudra générer un xcodeproj tout neuf de type "Static Library" pour y faire glisser les sources de RSColorPicker dedans (et bien sûr que les sources qui servent à  avoir l'objet RSColorPicker, pas besoin des autres sources servant uniquement à  l'appli de démo, comme le AppDelegate ou les ViewControllers et XIB de son appli de démo)
  • 'AliGator' a écrit:


    Dans tous les cas je suis allé voir vite fait le GitHub de RSColorPicker et il semble que le seul xcodeproj qui soit fourni soit un Xcodeproj pour générer son application de démo (et pas un xcodeproj pour générer une librairie indépendante que tu pourras ensuite intégrer dans tes projets), donc de toute façon il te faudra générer un xcodeproj tout neuf de type "Static Library" pour y faire glisser les sources de RSColorPicker dedans (et bien sûr que les sources qui servent à  avoir l'objet RSColorPicker, pas besoin des autres sources servant uniquement à  l'appli de démo, comme le AppDelegate ou les ViewControllers et XIB de son appli de démo)




    Oui, je viens de télécharger le xcodeproj, et je suis en train de virer ce qui ne sert qu'à  faire la démo... çà  confirme bien ce que j'avais compris, et çà  rassure le noob que je suis !
  • AliGatorAliGator Membre, Modérateur
    Oui enfin attention, si tu repars de son Xcodeproj et sa target qui génère une application de démo pour enlever tout ce qui ne sert à  rien, tu vas te retrouver avec juste les fichiers qui te sont nécessaires dans ce xcodeproj, certes, mais ça va toujours te générer une application, et pas une librairie, au final.

    Et pour que ça te génère une lib statique, tu vas avoir pas mal de modifications et bidouilles à  faire dans les "Build Settings" de la target pour transformer le produit généré de application à  librairie statique (type d'extension, type de préfixe, ne plus générer un bundle (.app) mais un fichier unique, et j'en passe un paquet)



    Donc soit tu repars de son xcodeproj, et tu rajoutes un target de type "Static Library" (qui sera donc toute pré-configurée pour générer une librairie et pas une appli), puis tu fais le ménage des fichiers obsolètes pour la lib, supprime le target qui génère l'application, et pense à  rajouter les fichiers utiles à  la lib dans la target de la lib avec la petite case à  cocher adéquate... ce qui finalement revient un peu à  tout démonter pour tout remonter autrement...



    Soit tu repars d'un xcodeproj tout neuf, directement créé avec le template "Static Library" et tu lui rajoutes les fichiers nécessaires de RSColorPicker. A mon avis ça sera plus simple que de bidouiller l'existant qui génère une appli.
  • 'AliGator' a écrit:


    Soit tu repars d'un xcodeproj tout neuf, directement créé avec le template "Static Library" et tu lui rajoutes les fichiers nécessaires de RSColorPicker. A mon avis ça sera plus simple que de bidouiller l'existant qui génère une appli.




    C'est bien ce que j'ai fait, et j'ai un bien un "libRSColorPicker.a" dans les products après compilation...



    Première étape réussie ; merci
  • Alf1996Alf1996 Membre
    janvier 2013 modifié #13
    Bon, alors quelques nouvelles...

    J'ai réussi à  créer mon workspace ; au lieu de créer un workspace vide, j'ai ouvert mon projet, et j'ai fait "save as workspace".

    Puis j'ai créé, dans ce workspace, un nouveau projet de type "static library", dans lequel j'ai supprimé les fichiers créés automatiquement (un .h, un .m et le -prefix.pch) pour les remplacer par les fichiers que j'avais téléchargés (sauf le xib et l'appDelegate). Dans les "supporting files", je n'ai mis que le -prefix.pch, je n'ai pas mis de main, ni de info-plist (est-ce OK ?). Puis, comme le nouveau projet ne s'était pas mis au bon endroit (il s'était mis à  l'intérieur de mon projet), je l'ai glissé pour qu'il soit bien un second projet. Ensuite, j'ai buildé pour le device, et j'ai inclus le .a à  la liste de mes frameworks, ce qui me donne ceci :

  • AliGatorAliGator Membre, Modérateur
    Alors :



    1) Le Full Path c'est normal, ça doit normalement pointer vers le même endroit que là  où sera aussi compilé ton application. Du moment que tu es "Relative to Build Products" et que le chemin relatif marqué sous le popupmenu est bien juste "libRSColorPicker.a" comme c'est le cas pour toi, c'est bon



    2) Ce que tu as oublié, c'est d'indiquer au xcodeproj de ton appli le chemin où trouver les headers de ta libraririe... et c'est vrai que j'ai oublié de mentionner ce point dans mon post au dessus.





    Il faut donc cliquer sur le xcodeproj de ton application à  gauche, et dans l'onglet "Build Settings" cette fois, renseigner le setting "Header Search Path". Tu dois lui rajouter comme valeur le chemin (relatif, par rapport à  ton App.xcodeproj) vers le dossier contenant les ".h" de RSColorPicker. Ca va donc sans doute être un truc comme "../RSColorPicker" ou un truc comme ça selon où tu as placé les sources de RSColorPicker par rapport au projet de ton appli.



    Il y a d'autres façons de faire (forcer le projet de la lib à  copier ses headers référencés comme "Publics" dans le dossier où tout ça est buildé pour qu'il les retrouve tout seul, en renseignant le "Install Path" de la lib à  "include/${TARGET_NAME}" + en passant "Skip Install" à  "NO" dans le xcodeproj de la lib et penser à  indiquer le "rôle" de chaque header de la lib alors) mais bon à  mon avis le plus simple reste de renseigner le "Header Search Path" dans le xcodeproj de l'appli quand même.



    Tant que tu es dans les "Build Settings" du xcodeproj de ton appli, je t'incite également à  rajouter "-ObjC" dans le setting "Other Linker Flags". Ce setting permet de s'assurer que lorsqu'on link avec une librairie tierce, on importe bien également les catégories, si la librairie en a déclarées.
  • LeChatNoirLeChatNoir Membre, Modérateur
    pour l'import du header, ca serait pas plutot un truc du genre ?
    <br />
    #import &lt;RSColorPicker/RSColorPicker.h&gt;<br />
    




    PS : t'as vu, je suis pas vexé image/smile.png' class='bbc_emoticon' alt=':)' />
  • AliGatorAliGator Membre, Modérateur
    janvier 2013 modifié #16
    Ca dépend comment tu as fait ça, y'a 2 écoles. La plus simple à  expliquer est la première, la plus propre est théoriquement la 2e, mais avec comme problème qu'elle pose des soucis avec le mode "Archive", de ce côté c'est un peu foireux...



    1) Soit dans le xcodeproj de ton application, tu renseignes le "Header Search Path" pour renseigner le chemin relatif des headers de RSColorPicker. Dans ce cas, un simple #import "RSColorPicker.h" suffit



    2) Soit tu as configuré le xcodeproj de la librairie pour qu'il copie les headers publics dans le dossier lors du build de la lib, ce qui permet alors de faire #import <RSColorPicker/RSColorPicker.h> mais encore faut-il avoir tout bien configuré dans le projet de la lib :
    • rajouter une phase "Copy Headers" dans la liste de "Build Phases",
    • pour chaque header de la lib qui doit être "public", le rajouter à  cette phase (ou tu as bien coché la case pour l'ajouter au target de la lib, puis spécifié son rôle parmis Public/Private/Project)
    • indiquer le "Public Headers Folder Path" comme étant "include/$(PROJECT_NAME)"
    • Pour que ça marche aussi quand on fait "Archive", il faut tricher un peu et indiquer comme "Installation Directory" la valeur "/../BuildProductsPath/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/" et encore ça ne marchera que si tous les projets (Application et Librairies) utilisent le même nom de configuration (typiquement "Release") pour le scheme "Archive"...


    Ce qui fait qu'au final, même si la solution 2 serait plus propre et permettrait d'utiliser #import <RSColorPicker/RSColorPicker.h>, elle a ses inconvénients en mode "Archive" pour ceux qui utilisent d'autres noms de configurations que "Debug" et "Release"... Donc au final même si c'est moins propre (car on va chercher dans toutes les sources de la lib et pas que les headers sensés être publics) je préfère souvent indiquer la solution 1.
  • Alf1996Alf1996 Membre
    janvier 2013 modifié #17
    Merci pour toutes ces informations. Je cale toujours... Je vais recommencer la création de la lib depuis le début, car j'ai du faire une boulette. Je vous tiendrai au courant. En tout cas, merci à  tous les deux !






    'LeChatNoir' a écrit:


    PS : t'as vu, je suis pas vexé image/smile.png' class='bbc_emoticon' alt=':)' />




    J'ai vu... T'es un bon petit chat !
  • super intéressant ce sujet, merci !
  • Bon, opération "grand ménage" prévue : je vais reconstruire tout mon projet ! Il commence à  y avoir tellement de classes, et de ressources, je vais en profiter pour mieux les ranger... La soumission approchant, çà  va faire du bien image/rolleyes.gif' class='bbc_emoticon' alt='::)' />

    Malheureusement, je ne vais pas avoir le temps aujourd'hui. Je vous tiens au courant demain soir... car il y aura surement une paire de questions !
  • AliGatorAliGator Membre, Modérateur
    C'est con parce que dans ma présentation de jeudi, j'explique aussi au passage comment les workspaces peuvent t'aider à  découper ton projet en modules pour mieux les organiser, l'idée étant, en plus d'expliquer comment intégrer des librairies tierces récupérées sur GitHub ou autre comme RSColorPicker, de créer tes propres librairies (potentiellement avec des ressources), pour ne pas avoir au final une seule grosse application mais un projet d'appli et plusieurs projets pour les différents "modules" (bon c'est pas toujours adapté, seulement aux vraiment gros projets, mais je sais pas comment est organisé le tien et si ça vaudrait le coup)
  • J'ai hate de voir la vidéo de ta présentation Ali image/thumbsup.gif' class='bbc_emoticon' alt='' /> dommage que je sois si loin image/crybaby.gif' class='bbc_emoticon' alt=' :'( ' />

    vive les cocoahead de Rennes en vidéo image/clap.gif' class='bbc_emoticon' alt=' :D ' />

    Je sens que moi aussi je vais devoir faire du ménage dans mon code source ...
  • AliGatorAliGator Membre, Modérateur
    Malheureusement, cette présentation doit en théorie ne durer que 30, maxi 45 minutes, et du coup j'aurai aimé expliquer et montrer dedans tout plein de trucs et d'astuces, mais je vais devoir synthétiser et résumer... donc j'espère que malgré l'aspect condensé de tout ce dont je veux parler vous allez avoir assez de billes pour vous en sortir, y compris avec les petits détails de réglages (ne pas oublier de changer tel ou tel réglage pour que ça colle, etc).

    Bref, toutes ces petites choses qui sont logiques et naturelles quand on est habitué au workflow d'une compilation en général (que ce soit sous Xcode, sous Eclipse, en ligne de commande ou autre) car on sait à  quoi correspond ces réglages, mais pour les noobs qui n'ont pas forcément de formation en informatique ce n'est pas forcément évident... et je n'aurai pour autant pas le temps de l'expliquer !
  • samirsamir Membre
    janvier 2013 modifié #23
    Hello,



    C'est trés intéressant la conférence, malheureusement c'est un peu loin.



    @AliGator : tu peux nous indiquer STP les références de la documentation sur les workspace ? Merci.
  • AliGatorAliGator Membre, Modérateur
    janvier 2013 modifié #24
    'samir2303' a écrit:
    @AliGator : tu peux nous indiquer STP les références de la documentation sur les workspace ? Merci.
    Heu... ça ?
  • C'est pas grave Ali si jamais on a besoin de plus de renseignement on sait tous où te trouver image/grin.gif' class='bbc_emoticon' alt=';D' />
  • 'AliGator' a écrit:


    C'est con parce que dans ma présentation de jeudi, j'explique aussi au passage comment les workspaces peuvent t'aider à  découper ton projet en modules pour mieux les organiser, l'idée étant, en plus d'expliquer comment intégrer des librairies tierces récupérées sur GitHub ou autre comme RSColorPicker, de créer tes propres librairies (potentiellement avec des ressources), pour ne pas avoir au final une seule grosse application mais un projet d'appli et plusieurs projets pour les différents "modules" (bon c'est pas toujours adapté, seulement aux vraiment gros projets, mais je sais pas comment est organisé le tien et si ça vaudrait le coup)




    Bon, tu m'as convaincue... Je vais reporter cette étape, et attendre sagement, mais avec impatience la video car c'est sur je ne serais pas à  Rennes jeudi...


    'AliGator' a écrit:


    Malheureusement, cette présentation doit en théorie ne durer que 30, maxi 45 minutes, et du coup j'aurai aimé expliquer et montrer dedans tout plein de trucs et d'astuces, mais je vais devoir synthétiser et résumer... donc j'espère que malgré l'aspect condensé de tout ce dont je veux parler vous allez avoir assez de billes pour vous en sortir, y compris avec les petits détails de réglages (ne pas oublier de changer tel ou tel réglage pour que ça colle, etc).

    Bref, toutes ces petites choses qui sont logiques et naturelles quand on est habitué au workflow d'une compilation en général (que ce soit sous Xcode, sous Eclipse, en ligne de commande ou autre) car on sait à  quoi correspond ces réglages, mais pour les noobs qui n'ont pas forcément de formation en informatique ce n'est pas forcément évident... et je n'aurai pour autant pas le temps de l'expliquer !




    Pas grave, même si c'est synthétique, çà  sera surement mieux que de tâtonner...



    Bon, de toute façon, j'ai encore quelques semaines de boulot sur mon application, avant d'être bloquée sur ce problème, et j'aurais surement des questions sur d'autres sujets !!! image/tongue.png' class='bbc_emoticon' alt=':P' />
  • Bon courage pour se soir image/clap.gif' class='bbc_emoticon' alt=' :D ' />



    Quoi que à  Rennes vous ne devez surement pas être sous la neige image/rolleyes.gif' class='bbc_emoticon' alt='::)' />



    Vivement la vidéo image/thumbsup.gif' class='bbc_emoticon' alt='' />
  • AliGatorAliGator Membre, Modérateur
    Merci !

    Pas encore de neige mais un peu de verglas, mais je vais réchauffer l'atmosphère ^^
  • DrakenDraken Membre
    janvier 2013 modifié #29
    En brûlant une voiture ou incendier une poubelle ? C'est un rituel humain courant au mois de Janvier, non ?
  • AliGatorAliGator Membre, Modérateur
    Non en faisant appel à  des dragons lanceurs de flammes image/wink.png' class='bbc_emoticon' alt=';)' />
  • Fichtre, t'as les moyens !
Connectez-vous ou Inscrivez-vous pour répondre.