Як додати провідну підкладку для перегляду, доданого всередині UIStackView


126

Це моє налаштування: у мене UIScrollViewпередній, верхній, випробувальний край встановлений на 0. Всередині цього я додаю UIStackViewцей обмеження:

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

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

Які способи я можу додати трохи підкладки до першого виду? Без коригування обмежень перегляду прокрутки.


2
Ви б міняли прийняту відповідь? Відповідь Толги здається набагато кращою.
Мед

Відповіді:


26

Надане вами рішення не додає прокладки для ваших поглядів усередині вашого UIStackView (як ви хотіли в запитанні), але воно додає провідні для UIStackView.

Рішенням може бути додавання іншого UIStackView до оригінального UIStackView та надання ведучого до цього нового UIStackVIew. Потім додайте свої погляди до цього нового UIStackView.

Підказка, ви можете це зробити повністю, використовуючи Interface Builder. Іншими словами, для цього не потрібно писати код.


374

Якщо isLayoutMarginsRelativeArrangementвластивість вірна, подання стека буде розміщувати влаштовані представлення відносно поля макета.

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

Але це впливає на всі влаштовані види всередині на подання стека. Якщо ви хочете, щоб ця підкладка була лише для одного упорядкованого виду, вам потрібно використовувати вкладеніUIStackView


2
isLayoutMarginsRelativeArrangementє геттер, сетер є layoutMarginsRelativeArrangement. Я не можу редагувати відповідь
maross

5
@maross в Swift немає різниці між функцією геттера та сеттера. Але ви маєте рацію, люди, які розвиваються за допомогою Objective-C, повинні використовувати layoutMarginsRelativeArrangementзамість цього. Офіційна документація: developer.apple.com/reference/uikit/uistackview/…
Tolga Okur

3
Для Objective-C:stackView.layoutMargins = UIEdgeInsetsMake(0, 20, 0, 20); [stackView setLayoutMarginsRelativeArrangement:YES];
Сноу

4
Лютий 2019 року, опівночі, сидячи в офісі - Такі відповіді дають мені сили рухатись вперед. Дякуємо @tolpp
nefarianblack

156

Я виявив, що обмеження не працюють в режимі перегляду стека, або вони здаються дещо дивними.

(Наприклад, якщо я додаю обмеження провідного / трейлінгу до вибраного на зображенні stackview, це також додає ведучий до колекції перегляду, але не додає трейлінгу; і це конфлікт точно).

stackview всередині stackview

Щоб встановити поля макета для всіх представлень даних у стеку, виберіть:

Stack View > Size Inspector > Layout Margins > Fixed

Примітка: "Fixed"варіант раніше називався "Explicit", як видно на знімках екрана.

Потім додайте ваші прокладки:

розповідь


23
одна з речей, яку Apple приховує. Я ненавиджу, як Xcode - протилежність хорошого, доброзичливого та легкого. Спасибі
Качка

Xcode продовжує виходити з ладу, коли я змінюю ці явні поля макета. Подала помилку, але вони відповіли, що це дублікат.
mvandillen

Ось що я не міг знайти в інтерфейсі користувача. Змініть поля макета на явне, щоб побачити поля для поля перегляду стека.
pamamb

13
FYI XCode 9 тепер називає це "Виправлено" замість "Явного".
Мел

Також у Xcode 9 зніміть прапорець "Використовувати посібники з безпечної компонування області" в Інспекторі файлів, який на момент написання все ще спричиняє багато проблем в IB, і дотримуйтесь звичайних посібників для макета для обмежень.
PJ_Finnegan

16

Що для мене працювало - це додати до перегляду стека ще один UIView, який є просто прокладкою (працює принаймні з stackView.distribution =. Заповнити):

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

6

стрімкий 3: Вам просто потрібно встановити компенсацію на:

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

Будьте впевнені, що це обмеження встановлено після вас parentView.addArrangdSubView(firstView)


4

Якщо вам потрібні лише провідні вкладки, ви можете встановити Вирівнювання подання стека на "Трейлінг", і тоді ви будете вільні вказувати унікальні обмеження для ведучих для кожного з підрозділів, що містяться в ньому.

Як бонус, ви також можете встановити вирівнювання подання стека на "Центр", а потім ви можете використовувати обмеження для ведучих та / або трейлінгу, щоб надати кожному елементу власну прокладку з обох сторін.


1

На це питання вже є хороші відповіді. Однак одна пропозиція, використовуйте spacingвластивість для встановлення проміжків між переглядами. Для першого та останнього переглядів може бути два варіанти: або встановити вставки, як @tolpp запропонував, або додати обмеження, що приєднується до батьків (stackview) з постійним додаванням прокладки.


0

Ми зробили додавання прозорих компонентів (наприклад, UIButton / UIView) як перших і останніх дітей UIStackView. Потім встановіть обмеження ширини цих невидимих ​​дітей, щоб відрегулювати прокладку.


0

Рішенням може бути регулярний вигляд у вікні стека, щоб містити будь-які представлення, до яких ви хочете додати обмеження, а потім ви можете додавати обмеження для елементів, що відносяться до переглядів у вікні стека. Таким чином, ваші початкові представлення можуть мати провідні та кінцеві обмеження в межах подання стека.

Це можна зробити в конструкторі інтерфейсів і програмно.


-3

Здається, рішення було досить простим. Замість:

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

Я щойно писав:

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

1
насправді ваш код додає провідне місце для uistackview всередині urscrollview, він не додає прокладки для ваших поглядів усередині вашого uistackview, (як йдеться в запитанні)
William Kinaan

так, але я не знаю, чи можна додати набивки, тож це допоможе мені.
Адріан

як перша думка, ви можете іншим uistackview замінити свій оригінальний uistackview і наділити його. потім додайте свої погляди до цього нового uistackview (ви можете це зробити повністю за допомогою конструктора інтерфейсів, для цього не потрібно писати код)
William Kinaan

Так, це спрацює. Ви можете додати відповідь, і я прийму її.
Адріан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.