单元格中的CGAffineTransform动画不起作用

3

我在对一个CollectionViewCell中的UIImageView进行动画设置时遇到了问题。我已经使用了Auto Layout来设置视图,但不确定是否会造成问题。

我尝试在didEndDisplaying中调用,但没有结果。

代码:

import UIKit

class ProfileCell: UICollectionViewCell {

    ....

    let backgroundImageView: UIImageView = {
        let iv = UIImageView(frame: .zero)
        iv.contentMode = .scaleAspectFill
        iv.image = UIImage(named: "lustrum2017")
        iv.clipsToBounds = true
        return iv
    }()

    var blurView: UIVisualEffectView = {
        let be = UIBlurEffect(style: .light)
        let vv = UIVisualEffectView(effect: be)
        return vv
    }()

    let profileImageView: UIImageView = {
        let iv = UIImageView()
        iv.image = UIImage(named: "dummy")
        iv.contentMode = .scaleAspectFill
        iv.layer.cornerRadius = 40
        iv.layer.masksToBounds = true
        iv.layer.borderColor = Colors.primaryColor.cgColor
        iv.layer.borderWidth = 1.0
        iv.transform = CGAffineTransform(scaleX: 0.001, y: 0.001)
        return iv
    }()

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

        setupViews()
        animateViews()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func animateViews() {

        self.profileImageView.transform = CGAffineTransform(scaleX: 1, y: 1)

        UIView.animate(withDuration: 0.45, animations: { 
            self.layoutIfNeeded()
        }, completion: nil)
    }

    private func setupViews() {
        contentView.addSubview(backgroundImageView)
        contentView.addSubview(blurView)

        contentView.addConstraintsWithFormat("H:|[v0]|", views: backgroundImageView)
        contentView.addConstraintsWithFormat("V:|[v0(150)]", views: backgroundImageView)

        contentView.addConstraintsWithFormat("H:|[v0]|", views: blurView)
        contentView.addConstraintsWithFormat("V:|[v0(150)]", views: blurView)

        blurView.addSubview(profileImageView)
        blurView.addConstraintsWithFormat("H:|-\(frame.width / 2 - 40)-[v0(80)]-\(frame.width / 2 - 40)-|", views: profileImageView)
        blurView.addConstraintsWithFormat("V:|[v0(80)]", views: profileImageView)
    }

    ....

}

如果你需要动画化某些东西?首先你需要设置一个初始值,然后你可以将其动画到所需的值。例如:将变换数值设置为0.75,然后再设置成1.0;就像这样。 - Mannopson
正如您所看到的,我在构建ImageView时已经完成了这个操作。 - SwingerDinger
这是一个用于UICollectionViewCell的自定义类,对吧? - Mannopson
1个回答

0
你可以尝试在UIView.animate块内进行转换,应该可以起作用。代码如下:
private func animateViews() {

    self.profileImageView.transform = CGAffineTransform.identity
    UIView.animate(withDuration: 0.45, animations: { 
        self.profileImageView.transform = CGAffineTransform(scaleX: 1, y: 1)
        self.layoutIfNeeded()
    }, completion: nil)
}

此外,如果您是从故事板/ xib 创建单元格而不是通过代码手动注册单元格,则awakeFromNib可能会为您带来想要的结果。
编辑:上面的答案假定您希望在创建单元格后首次发生动画,因为它似乎更类似于您的代码。如果您希望每次单元格出现在屏幕上时都调用它,则需要使用UICollectionViewDelegatecollectionView(_:willDisplay:forItemAt:)

这对我不起作用,即使在collectionView(_:willDisplay:forItemAt:)中调用动画也是如此。 - SwingerDinger
你确定在UIView.animation块中应用了变换(transform)吗?如果没有,它将不会执行动画,仅在其中使用self.layoutIfNeeded只会执行任何基于约束的动画。 - migues

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接