Как добавить ведущее дополнение для просмотра, добавленное внутри UIStackView


Это моя настройка: у меня есть UIScrollView с ведущим, верхним, пробным краем, установленным в 0. Внутри этого я добавляю UIStackView С этим ограничения:

stackView.centerYAnchor.constraintEqualToAnchor(selectedContactsScrollView.centerYAnchor).active = true  
stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

внутри стека я добавляю некоторые виды.
Моя проблема заключается в том, что из-за ограничений первый вид просмотр в стек также будет ведущей кромки = 0.

Каковы способы, которыми я мог бы добавить некоторые дополнения к первому представлению ? Без настройки ограничений вида прокрутки.

9 70

9 ответов:

решение, которое вы предоставили, не добавляет заполнение для ваших представлений внутри вашего UIStackView (как вы хотели в вопросе), но он добавляет ведущий для UIStackView.

решение может состоять в том, чтобы добавить еще один UIStackView внутри вашего исходного UIStackView и дать ведущий к этому новому UIStackVIew. Затем добавьте свои представления в этот новый UIStackView.

подсказка, вы можете сделать это полностью с помощью Interface Builder. Другими словами, нет необходимости писать код для него.

, когда isLayoutMarginsRelativeArrangement свойство true, представление стека будет размещать свои упорядоченные представления относительно полей макета.

stackView.layoutMargins = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
stackView.isLayoutMarginsRelativeArrangement = true

но это влияет на все упорядоченные виды внутри к виду стека. Если вы хотите, чтобы это дополнение было только для одного упорядоченного представления, вам нужно использовать вложенный UIStackView

Я обнаружил, что ограничения там не работают, или они работают странно (например, если я добавляю ограничение leading/trailing к выбранному на image stackview, что также добавляет ведущий к collectionview, но не добавляет трейлинг; и это наверняка конфликт).

stackview inside stackview

таким образом, вы можете сделать поля макета для всех видов/ stackviews внутри stackview.

выберите размер инспектор ->поля макета (явно) - > добавить дополнение

storyboard

то, что сработало для меня, - это добавить в stack view еще один UIView, который является просто разделителем (работает, по крайней мере, с stackView.распределение. = Заполнить):

let spacerView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 10))
stackView.addArrangedSubview(spacerView)
stackView.addArrangedSubview(viewThatNeedsSpaceBeforeIt)
stackView.addArrangedSubview(NextView)...

используйте интервал для размещения элементов в stackview:

        let bottomStackView = UIStackView()
        bottomStackView.alignment = .Center
        bottomStackView.axis = .Horizontal
        bottomStackView.spacing = 8.0

swift 3: Вам просто нужно установить смещение:

firstView.leadingAnchor.constraint(equalTo: parentView.leadingAnchor, constant: 200).isActive = true

убедитесь, что это ограничение задается после parentView.addArrangdSubView(firstView)

Если вам нужно только ведущее заполнение, то вы можете установить выравнивание вида стека в "трейлинг", а затем вы сможете указать уникальные ведущие ограничения для каждого из содержащихся в нем подвидов.

в качестве бонуса вы также можете установить выравнивание вида стека в "центр", а затем вы можете использовать ведущие и/или конечные ограничения, чтобы дать каждому элементу свое собственное заполнение с обеих сторон.

Кажется, что решение довольно простое. Вместо:

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

я писал:

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor, constant: 15).active = true

мы добавили прозрачные компоненты (например, UIButton/UIView) в качестве первого и последнего дочерних элементов UIStackView. Затем установите ограничение ширины этих невидимых детей, чтобы настроить заполнение.