9
votes

UitaireViewCell Autolayout avec Multi labels

J'essaie d'utiliser Autolayout dans UitailViewCell avec plusieurs étiquettes avec un calcul en pourcentage. Je veux un espace égal entre les étiquettes mais des largeurs différentes. De plus, la largeur et l'espace diffèrent en mode portrait et paysage comme affichés dans les images suivantes.

affichage du protraité

affichage du paysage

Je veux que l'espace soit 4 en portrait et 8 dans le paysage.

en portrait Label1 Largeur - 50% Label2 Largeur - 20% Label3 Largeur - 30%

dans le paysage Label1 Largeur - 50% Label2 Largeur - 15% Label3 largeur - 20% Label4 largeur - 15%

J'ai utilisé l'espacement horizontal et les contraintes supérieures et inférieures, mais cela ne résulte pas d'une largeur et d'un alignement de l'espace appropriés. La première ligne est également en tête d'en-tête, il ne faut pas avoir indicateur de divulgation et les lignes restantes devraient l'avoir. Toute aide serait appréciée.

Remarque: sa application universelle et IM à l'aide de SplitView dans iPad. En portrait, il devrait afficher 3 étiquettes comme sur iPhone et dans le paysage, il devrait afficher 4 étiquettes comme mentionnées ci-dessus. De plus, mon contrôleur d'affichage du maître est toujours visible.


12 commentaires

Vous devez utiliser des classes de taille pour y parvenir. Voici un très bon Tutoriel de Ray Wenderich


Définissez-vous des contraintes d'espacement et de largeur lorsque l'orientation change comme ce que vous voulez?


@Bhanupriya je ne fais rien de manière programmatique. Je sais que je peux y parvenir via le codage. Mais je cherche une solution à faire dans Storyboard.


Ensuite, @ericqian a raison. Vous devriez aller pour des cours de taille


@Ericqian cet échantillon donne des connaissances de base, mais cela ne m'aide pas car ma condition est un peu plus compliquée. Merci de votre aide.


@Sasim aimeriez-vous gérer l'espace entre les labels?


@Sasim j'ai une solution mais vous devez définir deux valeur multiplicateur constante par paysage et portrait avec code


@Gauravpatel Pouvez-vous l'expliquer en détail?


Dire - Label1 Largeur - 50% Label2 Largeur - 20% Label3 Largeur - 30%. Vous avez couvert un espace entier (50 + 30 + 20 = 100). Ce qui reste pour l'espacement.


La largeur sera (largeur - 4 * espace). Comprendre simple @Vats


@Sasim c'est possible uniquement avec la classe de taille


Dans Storyboard, vous ne pouvez pas faire de pourcentage de largeur de uiview en fonction de son superview de quelque manière que ce soit, même avec des classes de taille. Les classes de taille doivent vous aider à différencier la mise en page entre des écrans plus gros et plus petits, pour ne pas faire de la largeur de pourcentage.


5 Réponses :


-1
votes

Nous arrivons tout d'abord au problème que vous voulez de l'espace 4 en portrait et 8 dans le paysage.

Si vous connaissez bien les classes de taille, utilisez-les, à partir du bas de la carte de l'histoire, sélectionnez la classe de taille souhaitée (la classe de taille utilisée en mode portrait), vous pouvez utiliser la classe de format "Hauteur régulière de la largeur compacte" pour définir les contraintes pour tous les iPhones en mode portrait.

Maintenant, vous définissez la contrainte d'espacement horizontale entre les boutons, après avoir placé la contrainte d'espacement horizontal, vous pouvez le désactiver à partir des classes de taille dans lesquelles vous ne souhaitez pas cette contrainte, c'est-à-dire ces classes de taille utilisées en mode paysage.

Pour désactiver la contrainte spécifique pour n'importe quelle classe de taille, sélectionnez simplement cette contrainte, puis dans l'inspecteur d'attributs, vous verrez une case à cocher nommée «installée», ce qui signifie que cette contrainte est activée pour cette classe de taille. Par défaut, le "installé" est destiné à "toute" classe de taille "qui signifie que cette contrainte est appliquée à toutes les classes de taille, il suffit de décocher cette case à cocher.

sur le côté gauche de cette case "installée", une icône "+" qui vous aide à activer ou à désactiver la contrainte pour une classe de taille spécifique, sélectionnez donc la classe de taille souhaitée dans cette icône et cochez la case de cette classe de taille. .Voir l'image1 Entrez la description de l'image ici

Ajoutez maintenant une autre contrainte d'espacement horizontale pour le paysage et, désactivez-la de la classe de taille "toute autre" et activé-la pour n'importe quelle largeur, une hauteur compacte qui représente l'iPhone dans le paysage, vous avez maintenant ajouté deux mêmes contraintes avec différentes constantes qui fonctionnent différentes situations (une est portrait et autre dans le paysage).

Venez maintenant vers votre problème réel que vous souhaitez que la taille de vos étiquettes soit proportionnelle. Tout comme des contraintes, vous pouvez activer ou désactiver des vues pour différentes classes de taille, faites-la glisser quatre étiquettes sur la carte de l'histoire et désactivez la classe de taille de la quatrième pour «Hauteur régulière de la largeur compacte».

Pour activer ou désactiver la vue en classe spécifique, sélectionnez l'étiquette, puis utilisez la même case "installée" dans l'inspecteur attributé et désactiver la quatrième étiquette de la taille de taille "de hauteur régulière de la largeur compacte".

Maintenant, la seule chose qui reste est que vous souhaitez définir la largeur différente du paysage et du portrait. Pour cela, nous devons définir la contrainte de largeur de deux largeur pour chaque étiquette (une seule quatrième étiquette a une limite de largeur) une pour portrait et autre pour le paysage.

Maintenant, définissez la contrainte de largeur pour chaque étiquette de portrait comme vous le souhaitez et activez ces contraintes uniquement pour la catégorie de taille "de la hauteur régulière de la largeur compacte". De sorte qu'ils ne travaillent que dans le portrait.

maintenant à partir du bas de la carte Story change la classe de taille en "hauteur compacte régulière de la largeur" ​​et placez à nouveau les contraintes de largeur sur vos étiquettes cette fois-ci avec différentes constantes. Une chose que vous observerez que cette fois, vous pouvez définir la contrainte pour la quatrième étiquette car cette étiquette est uniquement visible est cette classe de taille.

Et c'est ça :) J'espère que cela vous aidera, dites-moi si cela fonctionne ou non.


2 commentaires

J'ai mis à jour ma question. Mon problème consiste à avoir 3 étiquettes dans Portrait et 4 étiquettes dans le paysage tout en utilisant SplitView dans iPad. Je ne l'ai pas mentionné clairement.


Donc, cela ne semble pas un problème, vous utilisez simplement le contrôleur d'affichage sur la carte de l'histoire et placez une vue sur ViewController, désactivez cette vue de taille de la taille de la "hauteur compacte régulière de largeur", puis faites glisser une vision de SplitView sur ce mode de vue et désactivez-la pour "largeur compacte" Hauteur régulière "classe de taille. Et puis vous avez deux vues séparées que l'une pour le portrait (UIView) et d'autres sont pour le paysage (UisplitView). Placez 3 étiquettes sur UIView et 4 étiquettes sur SplitView et activez les étiquettes pour leur classe de taille respective. Maintenant, vous pouvez utiliser ma réponse ci-dessus pour un guide supplémentaire.



-1
votes

Code ci-joint est une solution de votre problème dans iPhone. Il fonctionne exact comme votre problème de mention dans iPhone en mode portrait et paysage. Vous pouvez mettre à jour cette logique pour votre scission-vue dans iPad. Si vous avez trouvé un problème, veuillez commenter ici.

Ce problème est résolu avec une classe de taille dans iOS 8 selon la logique suivante.

1) Ajouter une vue de référence (vue jaune) avec largeur totale - espace total entre l'étiquette

Selon votre problème, vous avez mentionné ci-dessus, vous souhaitez ajouter des étiquettes conformément à la largeur de la cellule. Donc, pour que vous puissiez req. Largeur de référence parce que vous pouvez utiliser contenuview comme réf. Nous devons donc prendre une vue supplémentaire pour cette Vue jaune dans mon code de démonstration. Des espaces supplémentaires sont utilisés pour gérer les étiquettes d'espacement B / W.

2) Attribuez ensuite une largeur égale avec la vue de référence par multiplicateur

maintenant vous req. 50% de largeur pour la 1ère étiquette afin d'utiliser une logique multiplicateur que nous l'atteindrons. Par exemple, si vous voulez une première étiquette de 100px, définissez "Réf. Vue" de la largeur 200. Même chose que je gère pour une autre étiquette à 20% et 30% de la largeur du rapport de la largeur à réf. vue.

3) pour le mode portrait ajoutez une contrainte de plus pour la classe de format portrait

en mode portrait, vous req. Seulement 3 étiquettes, donc en utilisant la classe de taille Attribuer la largeur de la 4ème étiquette à 0.

Tout cela fait au-dessous du code

Vérifiez mon code avec la classe de taille

Télécharger


1 commentaires

Quelqu'un peut-il expliquer ce qui est un problème avec cela ??



1
votes

Comme les classes de taille ne font pas la distinction entre iPad en portrait vs iPad dans le paysage, vous ne pouvez pas utiliser de classes de taille. Ce que vous pouvez faire est dans votre XIB, vous définissez toutes les contraintes requises comme suit

  1. Définissez la contrainte pour l'espace entre les étiquettes et créez l'iboutlet pour celui-ci dans votre classe d'affichage, vous le prétendez "GapConstraint".

  2. Définissez la contrainte pour la largeur de chaque étiquette qui sera proportionnellement à la largeur de SUPERVIEW. Pour une plus grande contrainte d'étiquette serait BiggerLabel.Width = superview.width * 0.5.

  3. pour les étiquettes où vous souhaitez une largeur différente dans l'orientation de portrait et de paysage, définissez deux contraintes de largeur (une pour chaque orientation) et définissez la priorité d'une contrainte à 750 (disons hauts pour le portrait) et d'autres 500 (bas - disons pour le paysage). Créez les points de vente pour toutes ces contraintes. Nous devons définir deux contraintes de largeur (une pour portrait et une pour le paysage) pour chaque étiquette, car la propriété multiplicateur de NslayoutConstraint est réadonnée, une fois que le multiplicateur est attribué, nous ne pouvons pas modifier sa valeur. Pour résoudre ce problème, nous définissons deux contraintes et dans le code en fonction de l'orientation, nous activerons la contrainte plus appropriée en modifiant les priorités.

    Méthode UpdateConstraints UpdateConstraints et dans cette méthode, vous pouvez vérifier l'orientation du périphérique en cours. Si l'orientation du périphérique est une valeur de portrait, la valeur constante de GapConstraint (créée dans Point1) à 4, alors que dans le paysage, changez la valeur constante de GapConstraint (créée à Point1) à 8. Pour la largeur des étiquettes; Dans l'orientation portrait, changez la priorité de la contrainte de largeur de portrait à 750 et abaissez la priorité de la contrainte de largeur de paysage à 500, tandis que dans l'orientation du paysage, changez la priorité de la contrainte de largeur de portrait à 500 tout en augmentant la priorité de la contrainte de largeur de paysage à 750.


0 commentaires

-1
votes

Pour avoir un espacement égal dans UitailViewCell, vous pouvez ajouter des vues B / W Labels, puis définir Constarint à la largeur et à la hauteur de toutes les étiquettes pour être la même.

in Potrait dans le paysage


2 commentaires

La question était de savoir comment configurer des étiquettes de largeur différente.


@ Reinhardmänner Vous pouvez essayer avec une largeur différente. C'était juste à des fins d'illustration.



0
votes

Vous pouvez obtenir la mise en page souhaitée par des manières suivantes

Méthode 1: Utilisation de VLL

  1. Chaque fois que vous modifiez l'orientation de l'appareil, votre visualisation de tableView est automatiquement rechargée par la fonction CellfroworSpath.
  2. Vérifiez l'orientation du périphérique dans CellfrotOndrexPath 3.Remove Toute la sous-évaluation et ses contraintes 4.Ajouter à nouveau la sous-évaluation avec la spécification requise à l'aide de VFL.

    Méthode 2: Utilisation de différents Uitaires personnalisés

    Vous pouvez utiliser différents uitaires personnalisés pour chaque orientation.


0 commentaires