问题描述
我正在尝试展示一个带有 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)
}
}