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:
|[view1][view2]|
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 que UILabel
ou UIButton
.
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:
UILabel *label1 = [UILabel new];
label1.text = @"Label 1";
label1.backgroundColor = [UIColor blueColor];
UILabel *label2 = [UILabel new];
label2.text = @"Label 2";
label2.backgroundColor = [UIColor greenColor];
[self.stack1 addArrangedSubview:label1];
[self.stack1 addArrangedSubview:label2];
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.