2

CollectionViewCellの中にUIImageViewをアニメートすることに問題があります。 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

関連する問題