Comment utiliser l'auto-mise en page à déplacer d'autres points de vue 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.
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?
.....
- Modifier les contraintes de la valeur à l'exécution, cochez cette answer
- Pour ce cas précis, vous pourriez aussi utiliser un UIStackView. lorsque vous masquez les cd, les étiquettes d'occuper leur espace
Vous devez vous connecter pour publier un commentaire.
C'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:
Dans votre cas, cela signifie probablement:
Ce que vous devez faire est judicieusement sur-contraindre de 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.
|-(space)-[hidden(0)]-(space)-[visible]
est effectivement|-(2*space)-[visible]
. Deuxièmement, ce point de vue pourrait se lancer des violations de contrainte en fonction de son propre point de vue de la sous-arborescence et des contraintes que vous ne pouvez pas garantir que vous pouvez limiter arbitrairement un point de vue à 0 de la largeur et de l'avoir continuer à travailler.|-[otherViews]-[eitherThis][orThis]-|
), mais j'ai couru dans ce problème par la suite.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.
À cacher, mise à jour de la
.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?
NSLayoutConstraint
est de typeCGFloat
qui est un typedef pourdouble
(sauf sur l'Apple Watch, où c'est unfloat
). Donc, pour éviter un désordre jeté, il est préférable de définir la largeur de la contrainte à0.0
que de0.f
.Pour ceux qui soutiennent iOS 8+ seulement, il y a une nouvelle propriété booléenne active. Il permettra à seulement nécessaire les contraintes dynamiquement
P. S. Contrainte de la prise de courant doit être forte, pas faible
Exemple:
Aussi pour corriger une erreur dans le storyboard, vous aurez besoin de décocher
Installed
case à cocher pour l'une de ces contraintes.UIStackView (iOS 9+)
Une autre option est d'envelopper votre point de vue dans
UIStackView
. Une fois la vue est cachéeUIStackView
mise en page sera mise à jour automatiquementUIStackView
repositionne son point de vue automatiquement lorsque lehidden
propriété est modifiée sur l'un quelconque de ses sous-vues (iOS 9+).Saut à 11:48 dans cette WWDC vidéo pour une démonstration:
Mystères de la Mise en page Automatique, Partie 1
Mon projet utilise une coutume
@IBDesignable
sous-classe deUILabel
(pour assurer l'uniformité dans la couleur, la police, les encarts, etc.) et j'ai mis en place quelque chose comme ce qui suit:Cela permet à la sous-classe d'étiquette de prendre partie dans la Mise en page Automatique, mais ne prennent pas de place lorsqu'elle est cachée.
Pour les Googlers: bâtiment 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:
Dans ce cas, j'carte de la hauteur de la Auteur étiquette à un
IBOutlet
:et lorsque j'ai mis la hauteur de la contrainte à
0.0f
, nous préserver le "padding", parce que le Jouer bouton de la hauteur le permet.NSLayoutConstraint
je crois que vous souhaitez mettre à jour laconstant
propriété de votreauthorLabelHeight
.connecter contrainte entre uiview et labels IBOutlet et de définir la priorité des membres à moins de valeur quand jeu hidden = OUI
Ce que j'ai fait a été la création de 2 xibs. L'un avec la vue de gauche et l'un sans elle. Je me suis inscrit à la fois dans le contrôleur, puis a décidé de l'utiliser pendant cellForRowAtIndexPath.
Ils utilisent le même UITableViewCell classe. L'inconvénient, c'est qu'il y a de la duplication de contenu entre les xibs, mais ces cellules sont assez basique. L'avantage est que je n'ai pas un tas de code pour gérer manuellement la suppression de vue, la mise à jour des contraintes, etc.
En général, c'est sans doute une meilleure solution, car ils sont techniquement différentes mises en page et devrait donc avoir différentes xibs.
Dans ce cas, j'carte de la hauteur de l'Auteur de l'étiquette à un IBOutlet:
et lorsque j'ai mis la hauteur de la contrainte, 0.0 f, nous avons préserver le "padding", parce que le bouton de lecture de la hauteur le permet.
Utiliser deux UIStackView Horizontale et Verticale, lorsque certaines sous-vue vue dans la pile est caché à l'autre de la pile des sous-vues seront déplacés, l'utilisation de la Distribution -> Remplir Proporionally pour pile Verticale avec deux UILabels et la nécessité de définir la largeur et la hauteur constaints pour la première UIView
Essayer,j'ai mis en œuvre code ci-dessous ,
J'ai une Vue sur ViewController qui a ajouté trois autres points de vue, Lorsque l'un quelconque point de vue est cachée deux autres en vue de déplacer,Suivez les étapes ci-dessous.
1.ViewController.h Fichier
2.ViewController.m
L'espère cette logique aider quelqu'un.
Dans mon cas, j'ai mis la constante de la hauteur contrainte à
0.0f
et également définir lehidden
propriétéYES
.À montrer le point de vue (avec les sous-vues) encore une fois j'ai fait le contraire: j'ai réglé la hauteur constante à une valeur non nulle et de définir la
hidden
propriétéNO
.Je vais utiliser horizontale empilervoir. Il peut enlever le cadre lorsque la sous-vue est cachée.
Dans l'image ci-dessous, le rouge de la vue est le conteneur de votre contenu et a 10pt espace final à orange superview (ShowHideView), puis connectez simplement ShowHideView à IBOutlet et afficher/masquer/supprimer par programme.
Ce mon autre solution à l'aide de la priorité de la contrainte. L'idée est de définir la largeur de 0.
créer un conteneur view (orange) et de définir la largeur.
créer du contenu de la vue (en rouge) et de définir l'espace final 10pt à superview (orange). Avis de fuite des contraintes d'espace, il y a 2 fuite contrainte de priorité différente. Faible(=10) et Haute(<=10). Ceci est important pour éviter toute ambiguïté.
Jeu orange vue de la largeur de 0 pour masquer la vue.
Comme no_scene suggéré, vous pouvez certainement le faire en modifiant la priorité de la contrainte à l'exécution. C'était beaucoup plus facile pour moi parce que j'ai eu plus d'une vue de blocage qui aurait besoin d'être enlevé.
Voici un morceau de code à l'aide de ReactiveCocoa:
Dans le cas où cela aide quelqu'un, j'ai construit une classe d'aide pour l'utilisation de format visuel contraintes. Je l'utilise dans mon application actuelle.
AutolayoutHelper
Il pourrait être un peu adaptée à mes besoins, mais vous trouverez peut-être utile ou vous pouvez le modifier et créer votre propre helper.
Je dois remercier Tim pour son la réponse ci-dessus, ce répondre au sujet de UIScrollView et aussi ce tutoriel.
Voici comment je re-aligner mes uiviews pour obtenir votre solution:
J'ai créé une règle de pouce de ma part. Chaque fois que vous avez à montrer /cacher tout uiview dont les contraintes peuvent être touchés, ajouter tous les concernés ou dépendant de la sous-vues à l'intérieur d'une uiview et mise à jour de son leader /suiveur /haut /bas contrainte constante de la programmation.
C'est une vieille question, mais encore j'espère qu'il vous aide. Venant d'Android, dans cette plate-forme vous avez une méthode pratique
isVisible
de le cacher de la vue mais aussi de ne pas avoir le cadre considérés lors de la mise en page automatique de tirage de la vue.à l'aide de l'extension et de l'option "étendre" uiview que vous pourriez faire une fonction similaire dans ios (je ne sais pas pourquoi il n'est pas dans UIKit déjà) ici une mise en œuvre rapide 3:
la bonne façon de le faire est de désactiver les contraintes avec est actif = false. toutefois, de noter que la désactivation d'une contrainte supprime et des versions, de sorte que vous devez avoir des points forts pour eux.
Je pense que c'est plus simple répondez s'il vous plaît vérifier qu'il fonctionne bien
vérifier ici https://www.youtube.com/watch?v=EBulMWMoFuw