如何解决在视图控制器演示期间动画 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)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。