Анимация uistackview с использованием ishidden

[РЕДАКТИРОВАТЬ] Я подтолкнул фиксацию, которая содержит решение с нулевым ограничением высоты, однако теперь мне приходится иметь дело с неявными ограничениями UISV.

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

Screencast

Есть ли способ какао настроить анимацию для запуска снизу? P.S. Ссылка на проект.

Блок анимации:

UIView.animate(withDuration: 5.0,
                   delay: 0.5,
                   options: .curveEaseInOut,
                   animations:
        {
            self.buttons.forEach { $0.isHidden = !$0.isHidden }
            self.stack.layoutIfNeeded()
        }, completion: nil)

Вы можете показать только свой блок анимации?

Rakesha Shastri 10.08.2018 16:23

В проекте, с которым вы связались, нет представлений стека или кода анимации.

Abizern 10.08.2018 16:27

Я не думаю, что stackviews предназначены для такой анимации. Почему вы вообще хотите использовать для этого stackview?

Rakesha Shastri 10.08.2018 16:29

@Abizern Загружено

adnako 10.08.2018 16:47

@RakeshaShastri, потому что его компоновка проще, чем у обычного UIView.

adnako 10.08.2018 16:48

Какую часть экрана занимает ваше представление стека?

rob mayoff 10.08.2018 16:56

@robmayoff, нижняя часть экрана

adnako 10.08.2018 16:57
1
7
2 825
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Это не правильно. Вы должны анимировать полную кнопку снизу вверх. Не анимировать высоту. Пользователь знает разницу. Пожалуйста, взгляните на ответ Роба.

Rakesha Shastri 10.08.2018 18:23
Ответ принят как подходящий

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

Решение 1

Это решение хорошо работает, если нижний край представления вашего контроллера представления («корневое представление» сцены) находится у нижнего края экрана или если для него включен параметр «Обрезать границы».

  • Ограничьте нижнюю часть представления стека нижней частью безопасной области корневого представления, с приоритетом 999.
  • Ограничьте верхнюю часть представления стека до низа корневого представления (не безопасной области) с приоритетом 1000, но сделать это ограничение неактивным, сняв флажок «Установлено» в инспекторе атрибутов. Подключите розетку с именем stackHidingConstraint к этому ограничению.

Чтобы переключить видимость кнопок, установите stackHidingConstraint.isActive = !stackHidingConstraint.isActive. Когда ограничение активно, оно скрывает кнопки, убирая представление стека с нижнего края корневого представления. Когда ограничение неактивно, ограничение нижнего края priority-999 показывает кнопки, помещая представление стека над нижним краем безопасной области корневого представления.

Это выглядит так:

demo 1

Решение 2

Это решение работает в тех случаях, когда решение 1 не работает (если нижний край корневого представления вашей сцены не находится у нижнего края экрана и не имеет включенного параметра «Обрезать границы»), но требует небольшого изменения в иерархия представлений.

  • Встроить представление стека в контейнер UIView. Назовем это представлением, скрывающим стек.
  • Включите «Обрезать по границам», чтобы скрыть стек.
  • Ограничьте левый, правый и нижний края представления, скрывающего стек, левым, правым и нижним краями безопасной области корневого представления.
  • Ограничьте левый, правый и верхний края представления стека левым, правым и верхним краями представления, скрывающего стек.
  • Ограничьте нижний край представления стека нижним краем представления с приоритетом 999, скрывающего стек.
  • Ограничьте высоту представления, скрывающего стек, равным 0. Подключите розетку с именем stackHidingConstraint к этому ограничению. Сделайте это ограничение неактивным (удаленным) в раскадровке.

Еще раз, чтобы переключить видимость кнопок, установите stackHidingConstraint.isActive = !stackHidingConstraint.isActive. Когда ограничение активно, оно скрывает кнопки, устанавливая высоту вида, скрывающего стек, равным нулю. Поскольку представление, скрывающее стек, обрезает свои подпредставления, это делает подпредставления невидимыми. Когда ограничение неактивно, ограничение нижнего края priority-999 делает вид, скрывающий стек, равным по высоте представлению стека, поэтому подвиды видны.

Это выглядит так:

demo 2

Единственное видимое отличие от решения 1 состоит в том, что в решении 1 вы можете видеть, как кнопки перемещаются под панелью вкладок. В решении 2 они не скользят под панелью вкладок.

Вы можете найти мой тестовый проект здесь: https://github.com/mayoff/StackViewAnimation

хлопать в ладошихлопать в ладоши за старания! И, на мой взгляд, вы должны увидеть, как кнопка скользит из-под панели.
Rakesha Shastri 10.08.2018 18:25

Другие вопросы по теме