Динамический UIStackView против простых ограничений

Я пытаюсь создать представление стека с помощью UIStackView, которое всегда показывает максимум 3 представления, но также может отображать ни одно, 1 или 2 представления одновременно.

Весь вид стека должен быть динамическим. В начале представление стека пусто. Другая функция добавит новый вид вверху с помощью stackView.insertArrangedSubview(at: 0). Если добавляется другое представление, то предыдущее представление с индексом 0 должно быть перемещено в индекс 1. Вот почему я выбрал UIStackView, так как он заботится об изменении порядка существующих представлений.

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

Однако здесь есть небольшое дополнительное условие:

Представление в первом индексе всегда должно быть в два раза больше, чем оставшиеся 2 представления. Таким образом, первое представление должно составлять 50% всего представления стека. Таким образом, представления с индексом 1 и 2 должны иметь высоту 25%.

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

Идея аналогична тому, как работает Система уведомлений Growl.

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

Итак, теперь вопрос в том, является ли UIStackView правильным способом решения этой проблемы или будет лучше работать только с ограничениями (например, с SnapKit)? Даже с UIStackView мне, вероятно, потребуется много ограничений, чтобы выполнить требования.

Так что, может быть, мне просто нужно иметь функцию addNewView, которая обновляет все ограничения и вызывает layoutIfNeeded в блоке UIView.animate, чтобы переход представления отталкивал другие, а последнее представление вытеснялось?

Ребята, что вы думаете? Если существует структура, которая уже делает что-то подобное, я также был бы признателен за указатели.


person Jason McKenzy    schedule 19.03.2017    source источник
comment
Я надеюсь, что Вопросы и ответы могут быть вам полезны в качестве отправной точки...   -  person Ahmad F    schedule 19.03.2017
comment
Все это динамично, вероятно, потребует как ограничений, так и UIStackviews. Вы можете добавить ограничения ширины к представлениям, прежде чем добавлять их в представление стека, и представление стека будет учитывать эти ограничения. Но это очень широкий вопрос — нужно просто написать код и заставить его работать.   -  person Robotic Cat    schedule 19.03.2017


Ответы (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 всегда будут существовать такими, какими вы их видите здесь (с четким фоном, так что вы их на самом деле не видите). Когда вы добавляете/удаляете/перемещаете «новые» представления, вы добавляете их как подпредставления для A, B и C. Имеет ли смысл?

person DonMag    schedule 19.03.2017