UIView 从下到上的动画问题

UIView bottom to top animation issue

这是一个简单的函数,我用来从上到下动画视图,反之亦然(如果是从上到下动画,否则是从下到上动画):

@objc func openMenu(sender: UIButton) {
        if sender.tag == 1 {
            self.buttonView.tag = 2
             self.moduleView = ModulesCollectionView(frame: CGRect(x: 0, y: self.frame.origin.y + self.frame.size.height + 20, width: UIScreen.main.bounds.size.width, height: 0), collectionViewLayout: UICollectionViewLayout())
            self.window?.addSubview(self.moduleView)
            UIView.animate(withDuration: 0.7, animations: {
                self.moduleView.frame = CGRect(x: 0, y: self.frame.origin.y + self.frame.size.height + 20, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height - self.frame.size.height - 22)
            }, completion: { _ in

            })

        } else {
            self.buttonView.tag = 1
            UIView.animate(withDuration: 3, animations: {
                self.moduleView.frame = CGRect(x: 0, y: self.frame.origin.y + self.frame.size.height + 20, width: UIScreen.main.bounds.size.width, height: 0)
            }, completion: { _ in
                self.moduleView.removeFromSuperview()
            })
        }
    }  

顶部动画效果很好,视图在 0.7 秒内从上到下愉快地动画化。但是,不会发生从下到上的动画。视图立即被删除。这是我得到的结果:

但我希望动画在从下到上移动时也保持干净。就像here一样。

二级:我最终计划实现的是PullUpController具有完全相反的动画。因此,如果有人知道类似的库(下拉拖动)可以在那里分享输入。

更新 : 问题仅出现在 UICollectionView 中。我用一个简单的 UIView 替换了 collectionView,它工作得很好。

这是示例代码,希望对您有所帮助。

显示视图:

self.containerView = ModulesCollectionView(frame: UIScreen.main.bounds)
self.containerView.center = CGPoint(x: self.view.center.x,
        y: self.view.center.y + self.view.frame.size.height)
self.window?.addSubview(self.moduleView)
self.window?.bringSubview(toFront: self.moduleView)
self.window?.endEditing(true)
UIView.animate(withDuration: 0.3, delay: 0.0,
    usingSpringWithDamping: 0.7, initialSpringVelocity: 3.0,
    options: .allowAnimatedContent, animations: {
    self.moduleView.center = self.view.center
}) { (isFinished) in
    self.view.layoutIfNeeded()
}

隐藏视图:

UIView.animate(withDuration: 0.7, delay: 0.0,
    usingSpringWithDamping: 1, initialSpringVelocity: 1.0,
    options: .allowAnimatedContent, animations: {
    self.moduleView.center = CGPoint(x: self.view.center.x,
    y: self.view.center.y + self.view.frame.size.height)
}) { (isFinished) in
    self.moduleView.removeFromSuperview
}

您应该尝试在动画块结束后使用 layoutSubViews() 方法。像这样更改动画块。

对于 if 块:

self.moduleView.frame = CGRect(x: 0, y: self.frame.origin.y + self.frame.size.height + 20, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height - self.frame.size.height - 22)
self.moduleView.layoutSubviews()

对于其他块:

self.moduleView.frame = CGRect(x: 0, y: self.frame.origin.y + self.frame.size.height + 20, width: UIScreen.main.bounds.size.width, height: 0)
self.moduleView.layoutSubviews()