Как правильно анимировать UIStackView, скрывающийся внутри UITableViewCell? - PullRequest
0 голосов
/ 26 июня 2018

Я хочу анимировать подпредставления TableViewCell, который является StackView. Когда я скрываю StackView, высота TableViewCell не обновляется. После поиска в Google я обнаружил, что мне нужно вызвать tableView.beginUpdates и tableView.endUpdates, чтобы уведомить tableView об изменении ячейки. Проблема заключается в том, что анимация скрытия и изменение таблицы не синхронизированы.

Вот иерархия представления для ячейки табличного представления

Представление содержимого - Представление контейнера (для тени карты) - Представление стека контейнера - [Представление стека для метки и переключателя] & [StudentStackView для контейнера StudentView]

Как правильно синхронизировать высоту ячейки и скрыть анимацию?

Вот репозиторий github: GitHub

Gif приложения: UIStackView animated not sync with cell height

Ответы [ 3 ]

0 голосов
/ 26 июня 2018
 `public func setup(classRoom: ClassRoom, toggleInProcess: @escaping () -> (), toggled: @escaping () -> ()) {
        containerStackView.addArrangedSubview(studentStackView)
        self.nameLabel.text = classRoom.name
        self.activeSwitch.isOn = classRoom.isActive
        self.studentStackView.isHidden = !self.activeSwitch.isOn // Let him know his hide/unhide. 
        for student in classRoom.students {
            let studentView = StudentView()
            studentView.nameLabel.text = student.name
            studentStackView.addArrangedSubview(studentView)
        }
        activeSwitch.addTarget(self, action: #selector(toggleShowStudents(show:)), for: .valueChanged)
        self.toggleInProcess = toggleInProcess
        self.toggled = toggled
        setupShadow()
    }`


`  @objc func toggleShowStudents(show: Bool) {
        UIView.animate(withDuration: 0.3, animations: {
            self.studentStackView.isHidden = !self.activeSwitch.isOn
            self.toggleInProcess()
            self.containerView.layoutIfNeeded()
        }) { _ in
            self.toggled()
        }
    }`

your studentStackView также знает свой статус скрытия / отображения при назначении значений в функции setup.

0 голосов
/ 29 августа 2018

Вы правы в использовании beginUpdates()/endUpdates(). Убедитесь, что вы не помещаете someArrangedSubview.isHidden = true/false в анимационный блок, так как табличное представление и представление стека будут обрабатывать анимации соответственно. Когда табличное представление начинает операции обновления, представление стека изменит размер любых упорядоченных подпредставлений, которые вы не удаляете, чтобы заполнить все пространство ячейки (даже если у вас есть ограничения по высоте в упорядоченном подпредставлении). В моем случае содержимое ячейки перепрыгивало каждый раз, когда я хотел свернуть ячейку путем удаления упорядоченного подпредставления - поэтому я добавил фиктивное представление между представлением, которое я хотел бы оставить статичным *, и складным представлением. Статическое представление не изменится, и фиктивное представление будет расширяться / сворачиваться по мере необходимости. Надеюсь, это поможет.

* статический в том смысле, что я не хотел, чтобы при анимации вид перемещался.

0 голосов
/ 26 июня 2018

tableView.beginUpdates и tableView.endUpdates - это функции, которые следует вызывать, когда вы собираетесь изменить количество строк или выбранное состояние строк.

Вы должны попробовать reloadData или reloadrowsatindexpaths , которые должны позаботиться о настройке высоты ячейки.

Лучше сделать это с помощью API executeSelector, чтобы не вызывать рекурсию в cellForRowAt стеке вызовов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...