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
- оно скрывает (часто некрасивые) детали управления ограничениями от разработчика.