2015-09-02 16 views
8

içine düzgün yüzden geldi yukarı çalışmaz: Bir CollectionView programlı eklenenUIImageView animasyonlu Bu kod ile ben bir <code>UICollectionViewCell</code> içine animasyonlu bir <code>UIImageView</code> eklemek istiyorum UICollectionViewCell

import UIKit 

class MainViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate { 

    var items:[String] = ["one", "two", "three", "four"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.view.backgroundColor = UIColor(red: 220/255, green: 220/255, blue: 220/255, alpha: 1.0) 
     self.view.addSubview(self.collectionView) 
    } 

    lazy var collectionView:UICollectionView = { 
     var cv = UICollectionView(frame: self.view.bounds, collectionViewLayout: self.flowLayout) 
     cv.delegate = self 
     cv.dataSource = self 
     cv.bounces = true 
     cv.alwaysBounceVertical = true 
     cv.autoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth 
     cv.registerClass(CustomCell.self, forCellWithReuseIdentifier: "cell") 
     cv.backgroundColor = UIColor(red: 220/255, green: 220/255, blue: 220/255, alpha: 1.0) 
     return cv 
    }() 

    lazy var flowLayout:UICollectionViewFlowLayout = { 
     var flow = UICollectionViewFlowLayout() 
     flow.sectionInset = UIEdgeInsetsMake(2.0, 2.0, 2.0, 2.0) 
     return flow 
    }() 


    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize{ 

     let width:CGFloat = self.view.bounds.size.width*0.98; 
     let height:CGFloat = 150.0; 
     return CGSizeMake(width, height) 
    } 

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int{ 
     return self.items.count 
    } 

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CustomCell 
     cell.layer.cornerRadius = 4 
     cell.backgroundColor = UIColor.whiteColor() 
     cell.imgView.animationImages = ["1","2","3","4","5", "6","7","8"].map{UIImage(named: $0)!} 
     cell.imgView.animationDuration = NSTimeInterval(0.8) 
     cell.imgView.startAnimating() 
     return cell 
    } 

    func collectionView(collectionView: UICollectionView, shouldHighlightItemAtIndexPath indexPath: NSIndexPath) -> Bool { 
     return true 
    } 

    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 
     var alert = UIAlertController(title: "Alert!", message: "Cell tapped", preferredStyle: UIAlertControllerStyle.Alert) 
     var action = UIAlertAction(title: "ok", style: UIAlertActionStyle.Cancel) { (dd) -> Void in } 
     alert.addAction(action) 
     self.presentViewController(alert, animated: true, completion: nil) 
    } 

} 

Bu benim MainViewController olduğunu.

import UIKit 

class CustomCell: UICollectionViewCell { 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     self.addSubview(self.imgView) 
    } 

    lazy var imgView:UIImageView = { 
     var iv = UIImageView() 
     iv.contentMode = UIViewContentMode.ScaleAspectFill 
     return iv 
    }() 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 
     self.imgView.frame = CGRectMake(6,15,self.frame.width*0.2, self.frame.height*0.8) 
    } 
} 

Ve bu UIImageView kaybolur bir hücreyi dokunun ne zaman sorunudur bir UIImageView

ile benim özel UICollectionViewCell olduğunu. Sorunu çözmeye çalışmak için başka bir UICoolectionViewdelegesi yöntemlerine bakmaya başladım. Sonra shouldHighlightItemAtIndexPath kullanmayı denedim, ancak yanlış döndüren bu yöntemi kullanırsam, animasyon iyi çalışır, ancak koleksiyon görünümü didSelectItemAtIndexPath yanıt vermiyor.

Bu

sorunu gösteren bir kod ile bir github deposudur: https://github.com/gazolla/ImageAnimation ( çözümü ile güncellendi)

ÇÖZÜM: mat yardımıyla

, benim kodda aşağıdaki değişiklikleri yapmıştır:

1) highlightedAnimationImages özelliğine görüntüleri dizisi eklemek

let animationArray = ["1","2","3","4","5", "6","7","8"].map{UIImage(named: $0)!} 
cell.imgView.highlightedAnimationImages = animationArray 

2) Hücreler

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 

    let cell = collectionView.cellForItemAtIndexPath(indexPath) as! CustomCell 
    cell.imgView.startAnimating() 

    //... 

} 

ÇÖZÜM 2 seçildiklerinde hücreler

func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) { 
    if let cell = collectionView.cellForItemAtIndexPath(indexPath) as? CustomCell{ 
     cell.imgView.startAnimating() 
    } 
} 

3) Yeniden animasyon seçili olan başlatma animasyon: bazı testler sonra

, bunu tespit hücresine dokunup basılı tuttuğunuzda UIImageView hücresi tekrar kaybolur, dolayısıyla animasyonu anoda yeniden başlatmamız gerekir. Ther iki yöntem: Hücreyi seçtiğinizde

1) didHighlightItemAtIndexPath

func collectionView(collectionView: UICollectionView, didHighlightItemAtIndexPath indexPath: NSIndexPath) { 
     if let cell = collectionView.cellForItemAtIndexPath(indexPath) as? CustomCell{ 
      cell.imgView.startAnimating() 
     } 

    } 

2) didUnhighlightItemAtIndexPath

func collectionView(collectionView: UICollectionView, didUnhighlightItemAtIndexPath indexPath: NSIndexPath) { 
    if let cell = collectionView.cellForItemAtIndexPath(indexPath) as? CustomCell{ 
     cell.imgView.startAnimating() 
    } 
} 

cevap

2

, resim görünümü onun highlightedAnimationImages değil animationImages onun görünüyor. Hiçbir şey görmemek için highlightedAnimationImages'u ayarlamadınız.

İşte bunun işe yarayabileceğini gösteren bir ekran.arka plan gri olduğunda hücre seçildiğinde (yani onun selectedBackgroundView) ama animasyon devam ediyor: vaka başkasının karşılaşmalarda

enter image description here

+0

Cevabınız için teşekkür ederiz, matt. 'HighlightedAnimationImages' öğesini cellForItemAtIndexPath'e ekliyorum ve işe yaramıyor. Bu komutu başka bir yere koymalı mıyım? – Sebastian

+0

Sorudaki kodumla bir github deposu ekledim. – Sebastian

+0

Ayrıca animasyonu tekrar başlatmanız da gerekiyor. – matt

1

bu pis böcek ve yardımcı olmamaktadır Yukarıdaki çözümler - in imageView.stopAnimating() arayarak deneyin Cep telefonunuzun prepareForReuse() işlevi.

İlgili konular