UIStackViewвикористовує внутрішньо обмеження для позиціонування влаштованих підпереглядів. Саме те, які обмеження створюються, залежить від того, як налаштовано сам вид стека. За замовчуванням подання стека створюватиме обмеження, які викладають його підпорядковані підгляди по горизонтальній лінії, закріплюючи передові та кінцеві подання до власних передових і кінцевих країв. Отже, ваш код створить макет, який виглядає приблизно так:
|[view1][view2]|
Простір, який виділяється для кожного підперегляду, визначається низкою факторів, включаючи внутрішній розмір субпрогляду та його стійкість до стиснення та пріоритети захоплення вмісту. За замовчуванням UIViewекземпляри не визначають внутрішній розмір вмісту. Це щось, що зазвичай надається підкласом, таким як UILabelабоUIButton .
Оскільки опір стиснення вмісту та пріоритети захоплення вмісту двох нових UIViewекземплярів будуть однаковими, і жоден з представлень не забезпечує внутрішнього розміру вмісту, механізм компонування повинен найкращим чином здогадуватися, який розмір повинен бути призначений для кожного перегляду. У вашому випадку він призначає першому виду 100% наявного простору, а другому - нічого.
Якщо ви модифікуєте свій код, щоб UILabelнатомість використовувати екземпляри, ви отримаєте кращі результати:
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];
Зауважте, що не потрібно чітко створювати будь-які обмеження самостійно. Це головна перевага використання UIStackView- вона приховує (часто некрасиві) деталі управління обмеженнями від розробника.