Динамический UIStackView против простых ограничений
Я пытаюсь построить вид стека с UIStackView
это всегда показывает 3 просмотра в максимуме, но может также показывать ни один, 1 или 2 просмотра одновременно.
Весь вид стека должен быть динамическим. В начале вид стека пуст. Другая функция добавит новый вид сверху stackView.insertArrangedSubview(at: 0)
, Если добавлено другое представление, то предыдущее представление с индексом 0 должно быть перенесено в индекс 1. Поэтому я выбрал UIStackView
, поскольку он заботится о переупорядочении существующих взглядов.
Когда третий вид вставлен, два других снова опустятся вниз. Теперь, в случае, если четвертое представление будет добавлено, все предыдущие три представления снова сместятся вниз, но четвертое будет удалено из представления стека.
Вот небольшое дополнительное условие:
Представление в первом индексе всегда должно быть в два раза больше остальных двух представлений. Таким образом, первое представление должно составлять 50% от общего представления стека. Поэтому представления в индексах 1 и 2 должны иметь высоту 25%.
Если вводится новое представление, текущее представление с индексом 0, следовательно, должно будет сжиматься, перемещаться вниз к середине и перемещаться к индексу 1 представления стека.
Идея похожа на работу системы уведомлений Growl.
Это изображение показывает базовый макет того, как должны выглядеть виды.
ТАК вопрос сейчас, являются UIStackView
Это правильный способ решения этой проблемы или будет работать только с ограничениями (например, с SnapKit
) быть лучше? Даже с UIStackView
Мне, вероятно, понадобится много ограничений для выполнения требований.
Так что, может быть, я должен просто иметь addNewView
функция, которая обновляет все ограничения и вызывает layoutIfNeeded
в UIView.animate
блок, чтобы иметь переход вида, отталкивающего другие, и последний вид, выталкиваемый?
Что, вы парни, думаете? Если существует фреймворк, который уже делает что-то подобное, я был бы также признателен за указатели.
1 ответ
Вот один из вариантов. Вам понадобится небольшой код для управления добавлением / удалением представлений, но это не должно быть сложным. Примечания следуют за изображением:
Начните с размещения View A, View B и View C на главном экране. Не беспокойтесь о размере или позиционировании, и не давайте им никаких ограничений... StackView справится со всем этим.
Выберите B и C и внедрите их в вертикальный StackView. Alignment: Fill
, Distribution: Fill Equally
, а также Spacing: 8
Затем выберите A и только что созданный StackView и вставьте их в вертикальный StackView. Также настройте этот StackView с помощью Alignment: Fill
, Distribution: Fill Equally
, а также Spacing: 8
Теперь выберите этот вновь созданный StackView - "самый верхний" StackView - и присвойте ему ограничения по желанию... здесь я установил Leading, Top, Trailing и Bottom равными 16.
Теперь вам просто нужен код в соответствии с:
func addView(newView: UIView) -> Void {
// if ViewC has a subview, remove its subview
// if ViewB has a subview, move ViewB's subview to ViewC
// if ViewA has a subview, move ViewA's subview to ViewB
// add newView as a subview of ViewA
}
Тьфу... пытаясь понять это по-настоящему... Представления А, В и С всегда будут существовать так, как вы их здесь видите (с четким фоном, поэтому вы их не видите). Когда вы добавляете / удаляете / перемещаете "новые" виды, вы добавляете их как подвиды A, B и C. Имеет смысл?