[SWIFT 3] CollectionView et contrainte
Hello tout le monde,
J'ai un petit soucis de contrainte avec une collectionView..
En gros, je suis en train de développer une discussion de groupe, chacun peut envoyer des messages dans un groupe... un peu comme Whatsapp ou Messenger (en vachement plus lite ^^)
ça se passe relativement bien mais là je bloque sur un truc.. je pense qu'il me manque une contrainte mais impossible de réussir ce que je veux faire..
Voila où j'en suis :
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Commence par nous dire comment sont fixées les contraintes.
A priori, tu as une contrainte bottom = 0 entre la collection view et sa vue contenante, alors que ça devrait être avec le container.
J'vais essayé de poster tout le code utile.. C'est vrai qu'on y verra surement plus clair ^^
Voilà , il y a tout ce qui concerne les contraintes.. le reste c'est des fonctions pour créer les bulles, charger la discussion, envoyer un message, etc etc..
ça n'a pas d'influence sur les contraintes
En utilisant IB, tu verras immédiatement où se trouve les soucis l'agencement.
Et, surtout, arrêtes-toi d'utiliser les ! !!!
Parce que j'ai suivis un tuto qui faisait comme ça.. sur le coup c'était plus simple pour commencer.
Donc pas d'IB pour cette fois
Il y a les tutos et les tutos. Si tu a bien suivi le tuto, pourquoi tu as les soucis ?
Et, si un tuto t'apprend d'utiliser les !s comme tu l'as fait, c'est un très mauvais tuto !
Côté simplicité, créer les vues et contraintes en IB, c'est beaucoup plus facile que le code car IB te montrera, en couleur distincte, ou se trouve les fautes.
Mais, après tout ça, je te demande : est-ce que tu as commencer avec une UICollectionViewController avec la vue déjà là dedans?
Si oui, voilà ! Tes problèmes commencent là .
Pour tel agencement que tu veuilles, il faut commencer ave une UIView qui contient une UICollectionView et une UITextView. Puis, tu devras changer la classe du contrôleur de UIViewController à UICollectionViewController et reconnecter tous les outlet et delegates par main en IB.
Crois moi, avec IB tu gaspilleras beaucoup moins de temps.
Bonne question.. puis j'ai pris que ce qui m'intéressait dans le tuto.. il y a forcément des trucs que j'ai dû adapter avec mon code (le chargement des messages, l'envoi de message, etc etc)
J'attendais ta réflexion sur ça :P
Je suis pas sûr de comprendre mais je crois que oui..
OK, le tout en moins de 45 minutes
ça ressemble pas mal a ce que j'ai commencé à faire, d'un côté c'est rassurant ^^
Je continuerai ça mardi (j'vais profiter de quelques jours de congés ^^) mais en tout cas, merci Joanna pour l'aide et les explications
Dans les méthodes pour le clavier il ne faut que regler le constant sur le contrainte.
Et il n y a qu'une ! pour le IBOutlet
Mais notes bien quil n'y a que très peu de code ; c'est beaucoup plus facile d'utiliser IB, n'importe quoi que les tutos disent.
En effet, c'est plus simple comme ça..
Ce qui m'inquiète c'est comment je vais refaire les bulles de conversation.. A moins que je garde cette partie en code en espérant que ça s'intègre bien.. Mais bon, j'en suis pas encore là , je vais faire petit à petit ^^
Tu écris un "layout" dans une classe à part
Tu .. tu vas avoir quelques jours de congés à partir de mardi ?? Mon dieu .. Hollande est dans notre bar et nous ne le savions pas ! ???
Bon, je suis de retour et je continue donc sur mon soucis de chat..
J'ai refais mon storyboard avec la contrainte "bottom", comme tu me l'as expliqué.
Tu as changé le type de la cellule dans le UICollectionView ?
Je ne vois pas vraiment ce que tu veux dire
Ah oui ok.. c'est c'que j'me disais mais comme j'avais rien dans l'auto-complétion, j'pensais que je faisais fausse route.
J'ai donc créer un nouveau fichier UICollectionViewCell, appelé : ChatLogMessageCollectionViewCell avec comme code :
J'ai changé le type de la cellule par ChatLogMessageCollectionViewCell et j'ai changé ma ligne :
par
Par contre, j'ai rien qui s'affiche
Je passe bien dans mes fonctions "CreerMonMessage"
J'ai dû louper un truc.. Une idée ?
Tu as changer la classe de la cellule dans IB, comme je t'ai montré dans le screenshot ?
Il ne fallait pas changer le nom de la classe
Oui
Tu as déjà créé une classe ChatLogMessageCell, qui dérive de BaseCell, dont j'ai supposé de dériver de UICollectionViewCell.
Si ce n'est pas le cas, tu as raison de créer une autre classe qui dérive de UICollectionViewCell.
Bon alors en fait, quand je disais que je n'avais pas de cellule.. c'est juste que je ne les avais pas vu..
J'ai mis leur background en rouge, dans Content mode, j'ai mis : Aspect Fit et voila ce que j'ai :
Tu as créé la cellule visuellement, soit dans le storyboard, soit dans un XIB, avec tout ce qu'il faut comme UILabel, etc ?
Pour l'instant, ma storyboard ressemble à ça :
Jamais. Tu peux les mettre en place, avec les contraintes, dans la cellule dans le storyboard. C'est beaucoup plus facile que les construire en code.
Et, peut-être, tu pourrais faire deux cellules ; l'une pour les message reçus, l'autre pour les message émis.
Du coup, ça me sert à quoi de mettre ChatLogMessageCollectionViewCell dans la cellule si ça ne se sert pas du code pour créer le model de ma cellule ?
Peux tu me faire un exemple pour une cellule ? (enfin quand tu aura un peu de temps pour ça bien sûr)
Parce que là , je suis bloque et je suis complètement perdu
J'ai changé les UITextViews pour les UILabels mais l'idée est pareille
Ok je vois, c'est dans la classe de la cellule que je dois mettre les IBOutlets... je les mettais dans la classe de base.. du coup, j'avais toujours une erreur.. mais c'est plus logique maintenant que je comprends ^^
Du coup, par manque de temps dans le projet, j'ai mixé les 2 techniques (la page en storyboard, les cellules en programmation..)
Vu que j'avais déjà le code pour faire les bulles, etc etc, c'était plus rapide (pour cette fois ci).
Par contre je confirme, c'est carrément plus chiant de le faire en programmation qu'avec le storyboard (du coup, quand j'aurai plus de temps, je reviendrai dessus pour le refaire mieux et je pense d'ailleurs que ça sera plus propre..)
Du coup, je me suis débloqué en faisant comme ça :
Dans ma classe de base, j'ai rajouté :
Dans la classe de ma cellule (ChatLogMessageCollectionViewCell) :
J'ai rajouté la fonction init() où j'ai mis le setupViews() dedans.. j'avais oublié de mettre ça, c'est pour ça que j'avais jamais de cellule avec les messages de créé..
Ce post m'a aussi aidé : http://stackoverflow.com/questions/39438803/how-to-create-uicollectionviewcell-programmatically
Et au final, mon problème est résolu, le dernier message ne passe plus sous la barre de texte ^^
Je t'en prie !
Mais tu as fait une petite bêtise quand-même ::)
Tu ne devrais pas mettre le code pour créer les vues dans init(frame:_) parce qu'elle n'est pas appelé si la cellule est créée d'un storyboard ; viewDidLoad est le bon endroit.
Tu dois aussi considerer que les cellules sont réutilisées ; du coup, le même code pourrait être appelé plusieurs fois, en mettant plus de vues sur les précédentes, du coup, avalant plus de memoire.
C'est pour ça que je te conseillerais à nouveau de créer les cellules dans le storyboard.
Du coup j'ai testé une autre alternative ^^
Mais c'est clair qu'a terme, va falloir que je le refasse via le storyboard
Storyboard, c'est le Bien !
</p>