菜鸟教程小白 发表于 2022-12-11 19:01:00

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


                                            <p><p>我在为 <code>CollectionViewCell</code> 内的 <code>UIImageView</code> 设置动画时遇到问题。我用 <code>Auto Layout</code> 设置了 View ,不确定这是否会导致问题。</p>

<p>如果尝试调用 <code>didEndDisplaying</code> 但没有结果。
调用单元动画的正确生命周期函数是什么?</p>

<p><strong>代码:</strong></p>

<pre><code>import UIKit

class ProfileCell: UICollectionViewCell {

    ....

    let backgroundImageView: UIImageView = {
      let iv = UIImageView(frame: .zero)
      iv.contentMode = .scaleAspectFill
      iv.image = UIImage(named: &#34;lustrum2017&#34;)
      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: &#34;dummy&#34;)
      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(&#34;init(coder:) has not been implemented&#34;)
    }

    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(&#34;H:||&#34;, views: backgroundImageView)
      contentView.addConstraintsWithFormat(&#34;V:|&#34;, views: backgroundImageView)

      contentView.addConstraintsWithFormat(&#34;H:||&#34;, views: blurView)
      contentView.addConstraintsWithFormat(&#34;V:|&#34;, views: blurView)

      blurView.addSubview(profileImageView)
      blurView.addConstraintsWithFormat(&#34;H:|-\(frame.width / 2 - 40)--\(frame.width / 2 - 40)-|&#34;, views: profileImageView)
      blurView.addConstraintsWithFormat(&#34;V:|&#34;, views: profileImageView)
    }

    ....

}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您可以尝试在 <code>UIView.animate</code>block 内进行转换,它应该可以工作。如下:</p>

<pre><code>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)
}
</code></pre>

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

<p>编辑:上面的答案是假设您希望动画在第一次创建单元格后发生,因为它看起来更类似于您拥有的代码。如果您希望每次单元格出现在屏幕上时都调用它,那么您需要使用 <code>UICollectionViewDelegate</code> 的 <code>collectionView(_:willDisplay:forItemAt:)</code></p ></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 单元格中的 CGAffineTransform 动画不起作用,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/42287359/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/42287359/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 单元格中的 CGAffineTransform 动画不起作用