在视图控制器演示期间动画 collectionView 布局

问题描述

我正在尝试展示一个带有 UIViewControllerAnimatedTransitioning 动画的视图控制器,它从 alpha 0 到 1;同时将其集合视图从一种布局动画化到另一种布局。两种布局仅在节插入和行距方面有所不同。

这是从一种布局移动到另一种布局的代码

private var useAfterLayout = false
private let layoutBefore = (
    sectionInset: UIEdgeInsets(top: 100,left: 3,bottom: 3,right: 3),linespacing: CGFloat(10.0)
)

private let layoutAfter = (
    sectionInset: UIEdgeInsets(top: 3,linespacing: CGFloat(3.0)
)

func animatetoFinalLayout() {
    useAfterLayout = true
    collectionView.performBatchUpdates({
        collectionView.collectionViewLayout.invalidateLayout()
        collectionView.setCollectionViewLayout(collectionView.collectionViewLayout,animated: true)
    },completion: nil)
}

public func collectionView(
    _ collectionView: UICollectionView,layout collectionViewLayout: UICollectionViewLayout,insetForSectionAt section: Int
) -> UIEdgeInsets {
    useAfterLayout ? layoutAfter.sectionInset : layoutBefore.sectionInset
}

public func collectionView(
    _ collectionView: UICollectionView,minimumLinespacingForSectionAt section: Int)
    -> CGFloat {
    useAfterLayout ? layoutAfter.linespacing : layoutBefore.linespacing
}

我尝试在 animatetoFinalLayout 和 `animateTransition(using:) 中的动画块中调用 viewWillAppear(_:) 方法,但是视图控制器在出现时只有最终布局。

UIView.animate(withDuration: animationDuration,delay: 0.0,options: .curveEaSEOut,animations: {
    toView.center = transitionContext.containerView.center
    toView.alpha = 1.0
    animatedViewController?.animatePresentation()
},completion: { didComplete in
    transitionContext.completeTransition(didComplete)
})

调用放入 viewDidAppear(_:) 会为布局设置动画,但仅在演示动画完成后:

如何同步两个动画?

解决方法

正如 this comment 所建议的,使用以下代码可以使两个动画完美同步。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    DispatchQueue.main.async {
        UIView.animate(withDuration: 0.35,delay: 0.0,options: .curveEaseOut,animations: {
            self.animateToFinalLayout()
        },completion: nil)
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...