Développer des composants graphiques
Bonjour,
Je lance ici un sujet car cela fait un moment que je me pose la question.
Au cours de mon projet j'ai été emmené à développer plusieurs composants graphiques pour faciliter le développement. Jusque là , tout est normal !
Utilisant énormément le storyboard, je me demandais si il était possible d'intégrer ces composants graphiques, afin de pouvoir les utiliser via le storyboard comme tout autre composant de base de cocoa.
Je lance ici un sujet car cela fait un moment que je me pose la question.
Au cours de mon projet j'ai été emmené à développer plusieurs composants graphiques pour faciliter le développement. Jusque là , tout est normal !
Utilisant énormément le storyboard, je me demandais si il était possible d'intégrer ces composants graphiques, afin de pouvoir les utiliser via le storyboard comme tout autre composant de base de cocoa.
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Dans le temps (avant Xcode 4), on pouvait sur le Mac, mais la mise en oe“uvre était complexe: il fallait fournir l'IHM pour éditer les propriétés du contrôle.
Je trouve que sous iOS, on a de toute façon moins recours aux contrôles persos.
C'est vrai qu'avec Xcode4 on n'a plus les plugins IB qu'on avait avec Xcode3 (mais qui étaient une plaie à créer, et nécessitait que tous ceux qui voulaient ouvrir tes XIB aient le plugin d'installé sur leur mac en plus), et on a rien qui aille vraiment aussi loin, mais on peut quand même faire quelquechose.
Il se trouve que j'ai récemment répondu à une question similaire sur StackOverflow, par ici.
L'idée est d'avoir donc un composant qui hérite de UIView (ou d'une sous-classe de UIView), qui sait gérer son contenu tout seul, rien ne l'empêchant de charger son contenu depuis un fichier XIB ou Storyboard (avec les méthodes de NSNib adéquates par exemple, c'est un peu différent que d'utiliser un UIViewController pour charger un XIB mais ça se fait très bien).
Dans IB, quand tu veux placer ce composant dans ton interface, tu fais glisser une UIView, puis tu changes sa classe (via le "Identity Inspector") pour indiquer que ce n'est pas une instance de la classe UIView mais une instance de ton composant perso. Certes dans IB tu vas toujours voir un rectangle blanc comme une UIView classique, et pas le contenu final. Mais si tu l'as bien codée, à l'exécution ce composant chargera son contenu dynamiquement (création de ses subviews par code, ou par chargement d'un XIB par exemple).
Ensuite, une fois ce composant placé, tu peux ajuster les valeurs de ses propriétés internes toujours via le "Identity Inspector", dans la table "User Defined Runtime Attributes". Ca ne vaut pas un beau panneau comme dans le "Attributes Inspector" qui pré-liste toutes les propriétés modifiables avec des popups et tout, il faut que tu rentres à la main le nom de tes propriétés à modifier, en respectant bien leur nom et leur type.
Mais c'est pas mal quand même et ça devrait correspondre à peu près à ce que tu veux. Certes, pas aussi cool qu'une entrée customisée dans le "Attributes Inspector" mais mieux que rien /wink.png' class='bbc_emoticon' alt=';)' />
L'objectif n'était pas vraiment de pouvoir jouer avec le attribute inspector.
Sur mon storyboard, j'ai actuellement des dizaines de scènes, et avoir des composants blancs sur des composants blancs, c'est pas toujours pratique. L'objectif était surtout de pouvoir afficher graphiquement le composant dans le storyboard.
Bon je resterais attentif sur le sujet, et si une solution se présente j'en parlerais ici /wink.png' class='bbc_emoticon' alt=';)' />.
http://www.inline-studios.com/developer/articles/1-Xcode_4_Interface_Builder_Plugins/
J'ai ce lien dans mes signets depuis plusieurs mois, je n'ai pas encore eu le temps de tester.
(Enfin je l'ai mentionné dans ma réponse sur StackOverflow, j'ai pas jugé utile d'évoquer cette possibilité (non-officielle et non-documentée) sur CocoaCafé, c'est vrai /tongue.png' class='bbc_emoticon' alt=':P' />)
Mais il n'empêche que je ne suis pas sûr que ce soit une si bonne idée, car si on porte les anciens plugins IB Xcode3 sous Xcode4, on a les mêmes contraintes au final que sous Xcode3, à savoir la nécessité que tous ceux qui veulent utiliser notre composant ou éditer un XIB qui l'utilise installe un plugin sur leur Xcode.
Quand on travaille sur un composant réutilisable (surtout si on s'embête à créer un projet dédié pour générer un plugin IB, puis le convertir en plugin Xcode4, etc) c'est en général pour le partager avec d'autres et pas forcément pour se le garder pour soi. Mais du coup ça veut dire que tous tes collègues de travail doivent obligatoirement installer les mêmes plugins que toi pour pouvoir ouvrir tes XIB qui contiennent tes composants custom, et ça en pratique ça plombe l'intérêt de la solution je trouve.
Par contre on pourrait imaginer créer un plugin Xcode4 qui permet de représenter une UIView dans IB avec une image plutôt que juste un cadre blanc, juste pour que visuellement quand on ouvre un XIB on ne se retrouve pas avec 10 vues qui sont toutes blanches et du coup pas trop de retour visuel, mais qu'on puisse + facilement visualiser les différents composants qui seraient représentés avec des images miniatures représentatives.
Comme ça si on a cet hypothétique plugin ça nous facilite la vie pour éditer les XIB qui ont plein de custom UIViews, mais si on n'a pas le plugin ça ne nous empêche pas d'ouvrir le XIB quand même (on verra juste comme d'hab que du blanc sans trop savoir où cliquer pour sélectionner nos vues vierges)
Par contre, développer un plugin x-code est un domaine que je ne connais pas du tout . Je vais me renseigner sur le temps que ça peu prendre !