2

Ich habe ein Problem mit der Animation eines UIImageView in einem CollectionViewCell. Ich habe die Ansichten mit Auto Layout eingestellt, nicht sicher, ob das ein Problem verursachen könnte.CGAffineTransform Animation in Zelle funktioniert nicht

Wenn versucht, didEndDisplaying, aber ohne Ergebnisse anzurufen. Was ist die richtige Lifecycle-Funktion, um eine Zellanimation aufzurufen?

Code:

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

verwenden Wenn Sie etwas animieren müssen? Zuerst müssen Sie einen Anfangswert festlegen und dann können Sie Ihren gewünschten Wert animieren. Zum Beispiel: setze den Transformationswert auf 0,75 und dann auf 1,0; so ähnlich. – Mannopson

+0

Wie Sie sehen, habe ich das schon gemacht, als ich den Imageview erstellt habe. – SwingerDinger

+0

Es ist eine benutzerdefinierte Klasse für die UICollectionViewCell. Recht? – Mannopson

Antwort

0

Sie könnten innerhalb des UIView.animate Block die Transformation versuchen zu tun und es sollte funktionieren. Wie folgt:

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) 
} 

Auch, wenn Sie die Zelle aus dem Storyboard erstellt/xib anstatt manuell die Zelle über Code registrieren, awakeFromNib könnten Sie das Ergebnis erhalten Sie wollen.

Bearbeiten: Die obige Antwort geht davon aus, dass die Animation auftreten soll, sobald die Zelle zum ersten Mal erstellt wird, da sie dem Code, den Sie haben, ähnlicher zu sein scheint. Wenn Sie möchten, dass es jedes Mal aufgerufen wird, wenn die Zelle auf dem Bildschirm erscheint, dann müssen Sie die UICollectionViewDelegate 's collectionView(_:willDisplay:forItemAt:)

+0

Das funktioniert nicht, selbst wenn ich die Animation in 'collectionView (_: willDisplay: forItemAt:)' aufruft. – SwingerDinger

+0

Haben Sie sichergestellt, dass die Transformation innerhalb des UIView.animation Blocks angewendet wird? Es wird nicht ohne es animiert, wenn "self.layoutIfNeeded" darin nur constraint-basierte Animationen animiert – migues