2017-07-07 2 views
4

Le programme d'installation:cellules UICollectionView en continu centre à la fois verticalement et horizontalement à chaque fois que de nouveaux apparaissent

J'ai actuellement un UICollectionView qui est un groupe de cercles pour les cellules à mimer l'interface utilisateur de la montre d'Apple écran d'accueil. Je l'ai fait en suivant this guide. Dans le cas où vous n'avez pas lu l'article ou qu'il ne fonctionne pas pour une raison quelconque, il s'agit en fait d'une UICollectionView de cercles dont les externes sont réduits lorsque vous les faites défiler du centre.

Le problème:

Je veux des bulles pour faire apparaître dynamiquement de telle sorte que chaque fois qu'un utilisateur gagne un prix, le prix « apparaît », à savoir dans l'animez, mise à l'échelle de 0 à 1. Cependant, je voudrais tout les cellules peuvent être toujours centrées. Ainsi, lorsque, par exemple, l'utilisateur passe de 1 à deux prix, je veux que le premier à se déplacer vers la gauche alors que la nouvelle apparaît dans

Ce que j'ai essayé.

J'ai essayé implémentant la méthode insetForSectionAt de UICollectionView, mais cela ne semble pas fonctionner. Je suppose que c'est parce que le CollectionView n'est pas un avec FlowLayout. J'ai essayé le transformer en un, mais je fini par écraser tout ...

Le code:

Voici ce que j'ai mis en œuvre, au cas où l'article descend. (Condensé pour faciliter la lecture):

class CollectionViewLayout: UICollectionViewLayout { 
    //Invalidate the layout every time the bounds change so we can do the cool changes 
    override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { 
     return true 
    } 

    override var collectionViewContentSize: CGSize { 
     return CGSize(width: self.itemSize * CGFloat(COLS), 
        height: self.itemSize * CGFloat(ROWS)) 
    } 

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { 
     var attributes: [UICollectionViewLayoutAttributes] = [] 
     for i in 0..<cellCount { 
      let indexPath = IndexPath(item: i, section: 0) 
      attributes.append(self.layoutAttributesForItem(at: indexPath)!) 
     } 

     return attributes 
    } 

    override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { 
     var attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath) 

     // **Code where I create "z" variable by using equation in article, where "z" is just a value [0,1] that determines cell's scale** 

     // **More code where I Calculate "x" and "y" based on indexPath like in article**  

     //Set the cell's attributes: 
     attributes.transform = CGAffineTransform(scaleX: z, y: z) 
     attributes.size = CGSize(width: self.itemSize, height: self.itemSize) 
     attributes.center = CGPoint(x: x, y: y) 

     return attributes 
    } 

} 
+0

Que diriez-vous que vous définissez la propriété '' UICollectionView's' isPagingEnabled' encore'on'? –

+0

Je l'ai fait pour un autre de mes projets. Le problème est que la pagination se mette à des incréments de la largeur de l'écran, les cellules sont très petites et enclenchent verticalement et horizontalement – QuantumHoneybees

+0

Si tel est le cas, alors cela pourrait aider https://stackoverflow.com/questions/42486960/uicollectionview- horizontal échange avec l'espace entre-pages –

Répondre

2

Je crois qu'une solution à votre problème serait de faire défiler la vue de collection à la indexPath de ce que vous accorder voulez centrer depuis une vue de collection est une sous-classe d'un rouleau vue. Vous pouvez faire défiler la vue de collection à l'élément via:

collectionView?.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true) 

où indexPath est le indexPath que vous souhaitez faire défiler jusqu'à. Cela anime automatiquement votre défilement, si vous souhaitez personnaliser vous pouvez appeler la fonction UIView.animate