微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在视图控制器演示期间动画 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 举报,一经查实,本站将立刻删除。