Как анимировать удаление всех дочерних UIViewController с помощью одной анимации?

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

func removeAllChildrenWithAnimation() {
    if let children = viewController?.children {
        for child in children {
            child.willMove(toParent: nil)
            UIView.animate(withDuration: 0.25, animations: {
                child.view.alpha = 0.0
            }) { (_) in
                child.view.removeFromSuperview()
                child.removeFromParent()
            }
        }
    }
}

person Johnny Lynch    schedule 30.09.2019    source источник
comment
Что произошло, когда вы попробовали этот код? В чем здесь проблема?   -  person matt    schedule 30.09.2019
comment
Когда я включаю замедленное движение на симуляторе, я вижу анимацию для всех детей, когда удаляю их, но я просто хочу видеть только одну анимацию.   -  person Johnny Lynch    schedule 01.10.2019


Ответы (1)


Вы должны поместить все в один блок анимации:

Мне не удалось протестировать этот код — я даже не смог ввести его в Xcode и проверить синтаксис или скомпилировать — поэтому, пожалуйста, простите меня, если он содержит опечатку или две. Но в целом так и должно работать...

func removeAllChildrenWithAnimation() {
    guard let children = viewController?.children else { return }

    children.forEach { $0.willMove(toParent: nil) }

    UIView.animate(withDuration: 0.25, animations: {
        children.forEach { $0.viewIfLoaded?.alpha = 0.0 }
    }, completion: { finished in
        if finished {
            children.forEach {
                $0.viewIfLoaded?.removeFromSuperview()
                $0.removeFromParent()
            }
        }
    })
}
person Lutz    schedule 01.10.2019