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

Posted

技术标签:

【中文标题】单元格中的 CGAffineTransform 动画不起作用【英文标题】:CGAffineTransform animation in cell not working 【发布时间】:2017-07-06 08:32:19 【问题描述】:

我在为 UIImageView 设置动画时遇到了问题 CollectionViewCell。我已经用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;类似的东西。 如你所见,我在构建 imageview 时已经这样做了。 这是 UICollectionViewCell 的自定义类。对吗? 【参考方案1】:

您可以尝试在 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)

此外,如果您从 storyboard/xib 创建单元格而不是通过代码手动注册单元格,awakeFromNib 可能会为您提供所需的结果。

编辑:上面的答案是假设您希望动画在第一次创建单元格后发生,因为它看起来更类似于您拥有的代码。如果您希望每次单元格出现在屏幕上时都调用它,那么您需要使用UICollectionViewDelegate's collectionView(_:willDisplay:forItemAt:)

【讨论】:

这对我不起作用,即使在 collectionView(_:willDisplay:forItemAt:) 中调用动画时也是如此。 您确定在 UIView.animation 块内应用了转换吗?没有它它不会动画,在里面有self.layoutIfNeeded只会动画任何基于约束的动画

以上是关于单元格中的 CGAffineTransform 动画不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将一个单元格中的字符串放入我的索引匹配 VBa 脚本的中间

使用 CGAffineTransform 缩放 tableView 单元格以覆盖整个屏幕

excel 如何引用非空单元格中的数据到指定单元格中

如何在可重用的 tableView 单元格中更新 UITextfield 中的文本值,每个单元格中的值不同

Handsontable,设置单元格中的可见行数

如何将多个单元格中的字符串聚合到一个单元格中?