2

У меня проблема с анимацией UIImageView внутри CollectionViewCell. Я установил представления с Auto Layout, не уверен, что это может вызвать проблему.CGAffineTransform анимация в ячейке не работает

Если вы попросили позвонить в 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

Если вам нужно что-то оживить? Во-первых, вам нужно настроить начальное значение, а затем вы можете оживить его до нужного значения. Например: установите значение преобразования в 0.75, а затем 1.0; что-то вроде того. – Mannopson

+0

Как вы можете видеть, я уже сделал это при построении образа. – SwingerDinger

+0

Это настраиваемый класс для UICollectionViewCell. Правильно? – Mannopson

ответ

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

+0

Это не работает для меня, даже при вызове анимации в 'collectionView (_: willDisplay: forItemAt:)'. – SwingerDinger

+0

Вы обязательно применили преобразование внутри блока UIView.animation? Он не будет анимироваться без него, если 'self.layoutIfNeeded' внутри будет только анимировать любые анимации на основе ограничений – migues