350 votes

Comment faire pour utiliser la configuration automatique pour déplacer les autres vues lorsqu’une vue est cachée ?

J'ai conçu ma Cellule personnalisé de l'IB, sous-classé et connecté mon points de vente de ma classe personnalisée. J'ai trois sous-vues dans le contenu de la cellule qui sont: UIView (cdView) et deux étiquettes (titleLabel et emailLabel). Selon les données disponibles pour chaque ligne, parfois, j'ai envie d'avoir UIView et deux étiquettes affichées dans ma cellule, et parfois seulement deux étiquettes. Ce que j'essaie de faire est de définir les contraintes de cette façon si j'ai mis UIView à caché la propriété ou je vais l'enlever de superview les deux étiquettes à déplacer vers la gauche. J'ai tenté de UIView leader de la contrainte à Superview (contenu de la Cellule) pour 10px et UILabels principaux obstacles pour 10 px à la vue suivante (UIView). Plus tard, dans mon code

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(IndexPath *)indexPath {
...
Record *record = [self.records objectAtIndex:indexPath.row];

if ([record.imageURL is equalToString:@""]) {
     cell.cdView.hidden = YES;
}

Je suis à cacher ma cellule.cdView et je voudrais les étiquettes à déplacer vers la gauche cependant, ils sont rester dans la même position dans la Cellule. J'ai essayé de retirer la cellule.cdView de superview, mais il ne fonctionne pas non plus. J'ai joint une image pour clarifier ce que je suis sur le.

cell

Je sais comment le faire par programmation et je ne suis pas à la recherche de cette solution. Ce que je veux, c'est de définir des contraintes de l'IB, et j'espère que mon sous-vues vont se déplacer de façon dynamique si d'autres points de vue sont supprimés ou cachés. Est-il possible de le faire au bureau de l'IB avec mise en page automatique?

.....

388voto

Tim Points 33042

Il est possible, mais vous aurez à faire un peu de travail supplémentaire. Il ya un couple de choses conceptuelles pour sortir de la voie d'abord:

  • Cachés vues, même si elles ne sont pas dessiner, encore participer à Mise en page Automatique et généralement de conserver leurs cadres, en laissant les autres vues associées à leur place.
  • Lors de la suppression d'un point de vue de son superview, toutes les contraintes qui y sont liées sont également supprimées à partir de ce point de vue de la hiérarchie.

Dans votre cas, cela signifie probablement:

  • Si vous définissez votre vue de la gauche à être cachés, les étiquettes de rester en place, depuis que la vue de gauche est toujours de prendre de l'espace (même si il n'est pas visible).
  • Si vous supprimez votre vue de la gauche, des étiquettes à être laissé de côté, d'une manière ambiguë, contraint, puisque vous n'avez plus de contraintes pour vos étiquettes " gauche bords.

Ce que vous devez faire est judicieusement sur-contraindre vos étiquettes. Laissez vos contraintes existantes (10pts de l'espace à l'autre point de vue) seul, mais ajouter une autre contrainte: faire vos étiquettes " gauche bords 10pts loin de leur superview bord gauche avec une non-priorité requis (la valeur par défaut de haute priorité sera sans doute bien).

Puis, quand vous voulez les déplacer vers la gauche, enlevez la vue de gauche tout à fait. Obligatoire 10pt contrainte à la vue de gauche va disparaître de la vue, il se rapporte, et vous serez à gauche avec seulement une haute priorité contrainte que les étiquettes 10pts loin de leur superview. Sur la prochaine passe de mise en page, ce qui devrait entraîner l'expansion de gauche jusqu'à ce qu'ils remplir la largeur de la superview mais pour votre espace sur les bords.

Une importante mise en garde: si jamais vous voulez que votre vue de gauche en arrière dans l'image, non seulement avez-vous de l'ajouter dans la vue de la hiérarchie, mais vous avez aussi à rétablir toutes ses contraintes en même temps. Cela signifie que vous avez besoin d'un moyen de mettre votre 10pt espacement des contraintes entre le point de vue et ses étiquettes de retour à chaque fois que la vue est affiché à nouveau.

210voto

Max MacLeod Points 8425

De l'ajout ou de la suppression des contraintes au cours de l'exécution est un poids lourd de l'opération qui peut affecter les performances. Cependant, il existe une solution plus simple.

Pour la vue que vous souhaitez masquer, définissez une largeur de contrainte. Contraindre les autres points de vue avec un écart horizontal de ce point de vue.

Pour se cacher, mise à jour de l' .constant de la largeur de la contrainte à 0.f. Les autres points de vue seront automatiquement déplacer de gauche à assumer la position.

Voir mon autre réponse ici pour plus de détails:

Comment faire pour modifier l'étiquette de contraintes au cours de l'exécution?

12voto

jterry Points 2256

Pour les Googlers: construction sur Max de réponse, pour résoudre le problème de remplissage que beaucoup l'ont remarqué, j'ai simplement augmenté la hauteur de l'étiquette et utilisé à la hauteur de ce que le séparateur à la place du réel rembourrage. Cette idée pourrait être élargi pour n'importe quel scénario contenant des points de vue.

Voici un exemple simple:

IB Screenshot

Dans ce cas, j'carte de la hauteur de l' Auteur de l'étiquette appropriée IBOutlet:

@property (retain, nonatomic) IBOutlet NSLayoutConstraint* authorLabelHeight;

et lorsque j'ai mis la hauteur de la contrainte à l' 0.0f,- nous préserver le "padding", parce que le Jeu du bouton de la hauteur le permet.

9voto

no_scene Points 39

connecter la contrainte entre uiview et étiquettes IBOutlet et membre de régler la priorité à une moindre valeur lorsque la valeur cachée = YES

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X