J'essaye d'ajouter des vues dans UIStackView par programme. Pour l'instant mon code est:
UIView *view1 = [[UIView alloc]init];
view1.backgroundColor = [UIColor blackColor];
[view1 setFrame:CGRectMake(0, 0, 100, 100)];
UIView *view2 = [[UIView alloc]init];
view2.backgroundColor = [UIColor greenColor];
[view2 setFrame:CGRectMake(0, 100, 100, 100)];
[self.stack1 addArrangedSubview:view1];
[self.stack1 addArrangedSubview:view2];
Lorsque je déploie l'application, il n'y a qu'une seule vue et elle est de couleur noire. (View1 récupère également les paramètres pour view2)
ios
objective-c
ios9
uistackview
Altimir Antonov
la source
la source
addArrangedSubview:
, pasaddSubview:
Réponses:
Les vues de pile utilisent la taille du contenu intrinsèque, utilisez donc des contraintes de mise en page pour définir les dimensions des vues.
Il existe un moyen simple d'ajouter rapidement des contraintes (exemple):
Code complet:
Remarque: cela a été testé sur iOS 9
la source
UIViews
n'est pas le cas par défaut . Si l'affiche d'origine avait utilisé desUILabel
instances au lieu deUIView
, son code aurait fonctionné comme il s'y attendait. J'ai ajouté un exemple qui le démontre ci-dessous.Swift 5.0
Basé sur la réponse @ user1046037.
la source
activate(_:)
, et il est généralement plus efficace de le faire de cette façon developer.apple.com/documentation/uikit/nslayoutconstraint/…UIStackView
utilise des contraintes en interne pour positionner ses sous-vues organisées. Les contraintes exactement créées dépendent de la configuration de la vue de pile elle-même. Par défaut, une vue de pile crée des contraintes qui présentent ses sous-vues disposées sur une ligne horizontale, épinglant les vues avant et arrière à ses propres bords avant et arrière. Ainsi, votre code produirait une mise en page qui ressemble à ceci:L'espace alloué à chaque sous-vue est déterminé par un certain nombre de facteurs, y compris la taille du contenu intrinsèque de la sous-vue, sa résistance à la compression et ses priorités de respect du contenu. Par défaut, les
UIView
instances ne définissent pas une taille de contenu intrinsèque. C'est quelque chose qui est généralement fourni par une sous-classe, telle queUILabel
ouUIButton
.Depuis la résistance à la compression du contenu et les priorités de respect du contenu de deux nouveaux
UIView
instances seront les mêmes, et qu'aucune vue ne fournit une taille de contenu intrinsèque, le moteur de mise en page doit faire sa meilleure estimation de la taille à allouer à chaque vue. Dans votre cas, il attribue à la première vue 100% de l'espace disponible et rien à la deuxième vue.Si vous modifiez votre code pour utiliser des
UILabel
instances à la place, vous obtiendrez de meilleurs résultats:Notez qu'il n'est pas nécessaire de créer vous-même explicitement des contraintes. C'est le principal avantage de l'utilisation
UIStackView
- cela masque les détails (souvent laids) de la gestion des contraintes au développeur.la source
UIView
soi n'ont pas de taille intrinsèque. Vous devrez peut-être appliquer des contraintes supplémentaires à ces vues pour que la vue de pile sache quelle taille les créer.MyTextField.top = top+20
etbottom = MyTextField.bottom+20
. Je m'attendrais à ce que cela donne à mon avis une hauteur intrinsèque de 70, mais au lieu de cela, il se plaint de contraintes conflictuelles. Savez-vous ce qui se passe ici? C'est cette vue que je souhaite placer dans mon UIStackView.Dans Swift 4.2
la source
Vous devez définir votre type de distribution. Dans votre code, ajoutez simplement:
Ou vous pouvez définir la distribution directement dans votre générateur d'interface. Par exemple:
J'espère que ça aide;) Lapinou.
la source
Suivre deux lignes a résolu mon problème
Version Swift -
la source
Pour la réponse acceptée lorsque vous essayez de masquer une vue dans la vue de pile, la contrainte ne fonctionne pas correctement.
La raison est quand la peau
view
dansstackView
ce sera régler la hauteur à 0 pour l' animer.Solution modifiez la contrainte
priority
comme ci-dessous.la source
Amélioration de la réponse par @Oleg Popov
la source
Dans mon cas, le problème auquel je m'attendais était que je manquais cette ligne:
Après cela, plus besoin de définir des contraintes sur mes sous-vues organisées, la stackview s'en charge.
la source
Version Swift 5 de la réponse d' Oleg Popov , basée sur la réponse de user1046037
la source
Je viens de rencontrer un problème très similaire. Tout comme mentionné précédemment, les dimensions de la vue de pile dépendent d'une taille de contenu intrinsèque des sous-vues organisées. Voici ma solution dans Swift 2.x et la structure de vue suivante:
vue - UIView
customView - CustomView: UIView
stackView - UISTackView
sous-vues organisées - sous-classes UIView personnalisées
la source
Essayez ci-dessous le code,
Esperons que ça marche. Veuillez me faire savoir si vous avez besoin de plus de précisions.
la source