2015-09-02 12 views
8

vorrei aggiungere un UIImageView animato all'interno di un UICollectionViewCell così mi si avvicinò con questo codice:UIImageView animazione non funziona correttamente all'interno 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) 
    } 

} 

Questo è il mio MainViewController con un CollectionView aggiunto a livello di codice.

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

e questa è mia abitudine UICollectionViewCell con una UIImageView

Il mio problema è quando si tocca una cella del UIImageView scompare. Cercando di risolvere il problema ho iniziato a cercare un altro UICoolectionViewdelegato metodi. Quindi ho provato a utilizzare shouldHighlightItemAtIndexPath, ma se utilizzo questo metodo restituendo false l'animazione funziona correttamente ma la visualizzazione della raccolta non risponde a didSelectItemAtIndexPath.

Questo è un repository github con un codice che mostra il problema: https://github.com/gazolla/ImageAnimation (aggiornato con la soluzione)

SOLUZIONE:

Con l'aiuto di Matt, ho fatto le seguenti modifiche nel mio codice:

1) aggiungere immagini array highlightedAnimationImages proprietà

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

2) animazione riavvio quando le cellule sono deselezionate

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

3) animazione riavvio quando le cellule sono selezionate

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

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

    //... 

} 

SOLUZIONE 2:

Dopo alcuni test, ho scoperto che quando si tocca e tieni premuto una cella UIImageView scompare di nuovo, quindi dobbiamo riavviare l'animazione in ther due metodi:

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

risposta

2

Quando si seleziona la cella, la visualizzazione dell'immagine guarda al suo highlightedAnimationImages, non la sua animationImages. Non hai impostato il highlightedAnimationImages così non vedi nulla.

Ecco uno screencast che mostra che questo può funzionare.La cella è selezionata quando lo sfondo è grigio (che è il suo selectedBackgroundView), ma l'animazione continua:

enter image description here

+0

Grazie per la risposta, matt. Aggiungo 'evidenziatoAnimationImages' in' cellForItemAtIndexPath' e non funziona. Dovrei mettere questo comando in un altro posto? – Sebastian

+0

Ho aggiunto un repository github con il mio codice nella domanda. – Sebastian

+0

Devi anche ricominciare l'animazione. – matt

1

nel caso qualcuno incontri altrimenti questo le soluzioni sopra indicate non risolvono brutto bug e - provare a chiamare imageView.stopAnimating() in la funzione prepareForReuse() della tua cella.