2015-05-05 14 views
5

Sto provando a creare un UICollectionView in cui UICollectionViewCell viene ridimensionato quando "si lascia" l'area visibile nella parte superiore o inferiore. E viene ridimensionato alle dimensioni normali mentre "entra" nell'area visibile.UICollectionViewCell cambia la dimensione della cella durante lo scorrimento

Ho provato qualche codice di scala/animazione in: scrollViewDidScroll() , ma non riesco a farlo bene.

La mia funzione completa è simile al seguente:

func scrollViewDidScroll(scrollView: UIScrollView) { 

    var arr = colView.indexPathsForVisibleItems() 

    for indexPath in arr{ 

     var cell = colView.cellForItemAtIndexPath(indexPath as! NSIndexPath)! 
     var pos = colView.convertRect(cell.frame, toView: self.view) 

     if pos.origin.y < 50 && pos.origin.y >= 0{ 

      cell.hidden = false 

      UIView.animateWithDuration(0.5, animations: {() -> Void in 

       cell.transform = CGAffineTransformMakeScale(0.02 * pos.origin.y, 0.02 * pos.origin.y) 

      }) 

     }else if pos.origin.y == 50{ 

      UIView.animateWithDuration(0.5, animations: {() -> Void in 

       cell.transform = CGAffineTransformMakeScale(1, 1) 
      }) 

     } 
    } 
} 

E 'questo, in qualche modo l'approccio giusto, o c'è un altro modo migliore?

+0

Cerca in iCarousel. È una grande libreria che supporta l'effetto che penso tu stia cercando. – Tobias

+0

Grazie Tobias, vado a dare un'occhiata subito! – Kvarken

+0

Sei riuscito a farlo funzionare? –

risposta

4

non una soluzione completa, ma alcune osservazioni/indicatori:

  1. Non si dovrebbe pasticciare con le cellule vista collezione direttamente in questo modo, ma piuttosto avere un UICollectionViewLayout sottoclasse personalizzata che modifica il UICollectionViewLayoutAttributes per includere il transform desiderato e invalidando il layout ogni volta che è necessario.

  2. Fare if pos.origin.y == 50 non è sicuramente una buona idea, perché lo scorrimento potrebbe non passare da tutti i valori (ovvero, potrebbe passare da 45 a 53). Quindi, usa >= e includi un altro modo se vuoi assicurarti che la tua animazione venga eseguita una sola volta al "confine" (ad esempio, memorizza l'ultima posizione o una bandiera).

+0

Impressionante, lo terrò a mente e continuerò a testare cose. Grazie! – Kvarken