Я пытаюсь добавить представления в UIStackView программно. На данный момент мой код:
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];
При развертывании приложения отображается только 1 вид, и он черного цвета. (View1 также получает параметры для view2).
ios
objective-c
ios9
uistackview
Альтимир Антонов
источник
источник
addArrangedSubview:
, неaddSubview:
Ответы:
Представления стека используют собственный размер содержимого, поэтому используйте ограничения макета для определения размеров представлений.
Существует простой способ быстро добавить ограничения (пример):
Полный код:
Примечание: это было проверено на iOS 9
источник
UIViews
не имеет. Если бы оригинальный плакат использовалUILabel
экземпляры вместоUIView
, его код работал бы так, как он ожидал. Я добавил пример, который демонстрирует это ниже.Swift 5.0
Основано на ответе @ user1046037.
источник
activate(_:)
, и, как правило, это более эффективно сделать так. Developer.apple.com/documentation/uikit/nslayoutconstraint/…UIStackView
использует внутренние ограничения для позиционирования своих упорядоченных подпредставлений. Какие именно ограничения создаются, зависит от того, как настроено само представление стека. По умолчанию представление стека создает ограничения, которые размещают его упорядоченные подпредставления в горизонтальной линии, закрепляя передние и задние представления своими собственными передними и задними краями. Таким образом, ваш код будет производить макет, который выглядит следующим образом:Пространство, которое выделяется для каждого подпредставления, определяется рядом факторов, включая собственный размер контента подпредставления, его устойчивость к сжатию и приоритеты объятия контента. По умолчанию
UIView
экземпляры не определяют внутренний размер контента. Это то, что обычно предоставляется подклассом, таким какUILabel
илиUIButton
.Так как сопротивление сжатию контента и контент объятия приоритетов двух новых
UIView
экземплярах будут одинаковыми, и ни одно из представлений не обеспечивает собственный размер контента, механизм компоновки должен сделать наилучшее предположение относительно того, какой размер должен быть выделен для каждого представления. В вашем случае это назначение первому виду 100% доступного пространства, а второму - ничего.Если вы измените свой код, чтобы использовать
UILabel
вместо него экземпляры, вы получите лучшие результаты:Обратите внимание, что нет необходимости явно создавать какие-либо ограничения самостоятельно. Это главное преимущество использования
UIStackView
- оно скрывает (часто некрасивые) детали управления ограничениями от разработчика.источник
UIView
сами по себе не имеют собственного размера. Возможно, вам понадобится применить дополнительные ограничения к этим представлениям, чтобы представление стека знало, насколько велико их создание.MyTextField.top = top+20
иbottom = MyTextField.bottom+20
. Я ожидал бы, что это даст моему взгляду внутреннюю высоту 70, но вместо этого он жалуется на противоречивые ограничения. Вы знаете, что здесь происходит? Именно это представление я хочу разместить внутри своего UIStackView.В Swift 4.2
источник
Вы должны установить свой тип распространения. В вашем коде просто добавьте:
Или вы можете установить дистрибутив прямо в вашем конструкторе интерфейсов. Например:
Надеюсь, это поможет;) Lapinou.
источник
Следующие две строки исправили мою проблему
Swift версия -
источник
Для принятого ответа, когда вы пытаетесь скрыть любое представление внутри стекового представления, ограничение работает не правильно.
Причина в том, что при скрытии
view
вstackView
нем будет установлено значение 0 для его анимации.Решение изменить ограничение,
priority
как показано ниже.источник
Улучшено в ответ @ Олег Попов
источник
В моём случае я ожидал, что мне не хватит этой строки:
После этого нет необходимости устанавливать ограничения для моих упорядоченных подпредставлений, стековое представление позаботится об этом.
источник
Swift 5 версия ответа Олега Попова , основанная на ответе пользователя 1046037
источник
Я только столкнулся с очень похожей проблемой. Как упоминалось ранее, размеры стекового представления зависят от размера внутреннего содержимого упорядоченных подпредставлений. Вот мое решение в Swift 2.x и следующая структура представления:
вид - UIView
customView - CustomView: UIView
stackView - UISTackView
упорядоченные подпредставления - пользовательские подклассы UIView
источник
Попробуйте код ниже,
Надеюсь, что это работает. Пожалуйста, дайте мне знать, если вам нужно больше разъяснений.
источник