首页 > 解决方案 > CGAffineTransform 不适用于自定义 UIView

问题描述

我正在尝试创建一个自定义视图类,它是一个带有 UICollectionView 的弹出窗口。我已经创建了动画进出视图的函数,但实际上只有动画出函数起作用。

我正在设置约束如下...

override init(frame: CGRect) {
    super.init(frame: frame)
    commonInit()
}

func commonInit(){
    ...
    self.addSubview(collectionView)
    collectionView.bottomAnchor.constraint(equalTo: self.safeAreaLayoutGuide.bottomAnchor).isActive = true
    collectionView.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
    collectionView.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
    collectionView.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.7).isActive = true
    ...
    self.animateIn()
}

然后处理我正在使用以下的动画......

func animateIn(){
    self.collectionView.transform = CGAffineTransform(translationX: 0, y: self.collectionView.frame.height)
    self.blurredBackgroundView.alpha = 0      
    UIView.animate(withDuration: 0.5, animations: {
        self.blurredBackgroundView.alpha = 1
        self.collectionView.transform = .identity

    })
}

animateOut 函数(有效)是......

func animateOut(){
    UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 1, options: .curveEaseIn, animations: {
        self.collectionView.transform = CGAffineTransform(translationX: 0, y: self.collectionView.frame.height)
        self.blurredBackgroundView.alpha = 0
    }) { (complete) in
        if complete {
            self.removeFromSuperview()
        }
    }
}

但最初的 CGAfineTransform 不起作用,因此视图在首次出现时出现在其最终位置。我很困惑,因为它非常适合在按下按钮关闭弹出窗口时调用的 animateOut 函数。

谁能告诉我我做错了什么?我觉得一定有一些基本的东西我错过了。

谢谢

标签: swiftxcodeuiviewcgaffinetransform

解决方案


您正在尝试从初始化程序启动动画,但到那时,视图已经不是视图层次结构的一部分。由于不可能对不属于视图层次结构的视图进行动画处理,因此会立即应用转换。animateOut工作正常,因为当您调用它时,视图已经显示。

您需要做的是animateIn在视图添加到视图层次结构后显式调用您的函数

let yourView = YourView(frame: someFrame)
superview.addSubview(yourView)
yourView.animateIn()

推荐阅读