Question contraintes...
Bonjour à tous,
j'ai besoin de votre avis éclairé pour l'utilisation des contraintes dans une appli
cette appli n'a qu'une seule vue
cette vue comporte 170 UIimageView
je souhaite que les proportions et l'ordre de ces 170 UIimageView soient respectées quelque soit le device : iPhone ou iPad
je me fiche de la taille des UIimageView je souhaite juste que le design soit le même pour tous les devices
voici une idée en image de ce que je souhaite :
est ce que c'est les contraintes qu'il faut utiliser ou une autre méthode pour obtenir ce résultat?
d'avance je vous en remercie
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Cela se fait en quelques lignes de code, sans passer par Storyboard ..
aurais-tu la gentillesse de me mettre sur une piste ? ( j'ai un niveau très moyen)
UIImageView *dot =[[UIImageView alloc] initWithFrame:CGRectMake(50,50,20,20)];
pour créer une UIimageView avec des coordonnées ene taille connues
comment faire avec des proportions utilisables quelque soit la taille et le format de l'écran
un exemple...
UICollectionView.
Sinon, j'espère sincèrement que tu ne les as pas toutes mises à la main.
En réalité, tu n'as pas forcément besoin des contraintes. Tu connais la taille de la vue/écran, et tu peux setter les frames ainsi dans un for loop.
J'y travaille. Je te donne ça demain. Par contre, je te préviens ce sera en Swift. D'ailleurs, si tu es novice, tu ferais bien de laisser tomber l'obj-C tout de suite pour passer à swift.
merci beaucoup Darken !!!!!
ok pour le swift
en attendant de tes nouvelles je m'instruis : https://www.appcoda.com/ios-programming-uicollectionview-tutorial/
pour info je dois pouvoir assigner une couleur a chaque UIimageview ( il faut donc que chacune comporte un nom pour l'ddentifier )
en fait mon appli reçois des infos de couleur pour chaque UIimageView via un server (la partie communication est déjà faite) comme si chaque UIimageview était un pixel d'écran
Tu veux dire que chaque UIImageView ne sert qu'a afficher une seule couleur et non une image ? Dans ce cas, il faut utiliser des UIViews pour ne pas se compliquer la vie.
oui que de la couleur
voici ce que j'utilise pour le moment :
lastValueled001R
lastValueled001V
lastValueled001B
sont les valeurs de couleur reçu par le serveur pour chaque UIViews
et ça 170 fois...pour chacun de mes pixel
Ca, c'est ce que j'aimerai ;-))
Pour le moment j'arrive à ça, mais la taille est fixe et non proportionnelle aux dimensions de l'écran
d'ailleur pour remplir toute la vue, j'ai du mettre 180 cases alors que je n'en veux que 170
avec ce code
C'est normal, ce que tu veux faire est tout simplement impossible. Les différents écrans n'ont pas les mêmes proportions. Tu ne peux pas avoir un jeu de valeurs uniques correspondant à tous les cas de figure.
Pour remplir l'écran à chaque fois, il faut forcément faire varier quelque chose : soit le ratio hauteur/largeur des éléments, soit la taille de l'écart x et y les séparant.
Première version :
Les cases sont dessinés sur maVue. C'est une UIView que j'ai placé sur l'écran avec Storyboard, avec des contraintes la forçant à prendre la même dimension que la SafeArea.
Les vues sont stockées dans un tableau, pour y accéder facilement par la suite, pour changer les couleurs. Elles sont numérotées de 0 à 169.
Le ratio hauteur/largeur n'est pas conservé, mais le résultat est pas mal, sur les différents iPhones.
iPhone SE :
iPhone 8+ :
iPhone X :
Il y a un concours à celui qui saura gâcher le plus de temps processeur aujourd'hui ?
UIView.drawRect()
C'est pas faux !
Utilisez:
Puis séparez la fenêtre en deux en vous mettant en mode "Assistant Editor", pour avoir le code sur la gauche et l'aperçu sur la droite.
Pour suivre le conseil de monsieur Céroce, j'ai créé une nouvelle classe servant à dessiner une grille de cases de couleur.
Le dessin des cases de couleur se fait directement dans la fonction drawRect(), avec des fonctions graphiques de base. Comme le dis l'espèce en voie de disparition pour cause de braconnage, le système n'a pas à gérer une multitude de sous-vues, ce qui consomme beaucoup moins de mémoire et de temps de calcul.
La couleur des cases est définie dans un tableau de couleurs, accessible à travers une propriété de la classe Grille.
Mise en pratique :
a
La grille est placée sur la vue maVue, définie sous Storyboard avec des contraintes pour occuper la même place que la SafeArea (pour garantir que cela fonctionne aussi sur un iPhoneX).
a
Copie d'écran (iPhone 8+) du résultat :
Pour obtenir des cases parfaitement rectangulaires, la vue contenant la grille doit toujours avoir un rapport largeur/hauteur de 1,7. Tu peux obtenir ça avec du code, ou une contrainte Storyboard de ratio sur la vue maVue "encapsulant " la grille.
Cela t'aide, jeffadsl ?
Une petite variante pour ajouter une marge entre chaque case :
Mise en oeuvre :
a
a
Si la marge est fixée à 0, l'affichage est identique à la version précédente.
Exemple (iPhoneX - marge de 2 points) :
Draken,
C'est juste parfait!!!!
il est vrai que le swift est autrement plus intuitif et léger.
j'essaye d'intégrer mon code pour la réception de donnée ( qui lui est en Objective-c )
je te tiens au courant
10000X merci!!!!
Heureusement, vu que le swift a été écrit par des gens avec une grande expérience en Obj-C, dans l'objectif de le remplacer.
Je remarque, dans ton exemple, que la grille est affichée à partir du haut de l'écran, sous la barre de statut. Est-ce voulu ?
J'avais eu le même effet à mon premier essai, que j'ai corrigé en affichant la grille dans une fenêtre située sous la barre de statut, avec une contrainte Storyboard.
Juste vous êtes pas en train de réinventer la roue. Une CollectionView aurai été bien plus simple non ?
Cela consomme beaucoup plus de ressources mémoire, de puissance processeur et donc de consommation batterie qu'un drawrect, pour un résultat visuel identique.