单元格中的 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 动画不起作用的主要内容,如果未能解决你的问题,请参考以下文章
使用 CGAffineTransform 缩放 tableView 单元格以覆盖整个屏幕