¿Obtiene indexPath of cell en el centro de la colecciónView en swift?

He intentado esto para get el índice de una celda en el centro de una vista de colección utilizando una extensión de uicollectionview, pero siempre obtengo nil en lugar del índice. ¿Cómo puedo arreglar esto?

extension UICollectionView { var centerPoint : CGPoint { get { return CGPoint(x: self.center.x + self.contentOffset.x, y: self.center.y + self.contentOffset.y); } } var centerCellIndexPath: NSIndexPath? { if let centerIndexPath: NSIndexPath = self.indexPathForItemAtPoint(self.centerPoint) { return centerIndexPath } return nil } } 

entonces: en un UIViewController en un método aleatorio, tengo esto:

 if let centerCellIndexPath: NSIndexPath = collectionTemp!.centerCellIndexPath { print(centerCellIndexPath) } else { println("nil") } 

la ruta del índice es siempre nula, y no entiendo por qué, porque las celdas se muestran en order, todo está bien, excepto esto.

He logrado resolver mi problema utilizando un layout personalizado que siempre mantiene una celda en el centro. Usando esto, indexPath en el centro nunca puede ser nulo.

  class CenterFlowLayout: UICollectionViewFlowLayout { override func targetContentOffsetForProposedContentOffset(proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint { if let cv = self.collectionView { let cvBounds = cv.bounds let halfWidth = cvBounds.size.width * 0.5 let proposedContentOffsetCenterX = proposedContentOffset.x + halfWidth if let attributesForVisibleCells = self.layoutAttributesForElementsInRect(cvBounds) as [UICollectionViewLayoutAttributes]! { var candidateAttributes: UICollectionViewLayoutAttributes? for attributes in attributesForVisibleCells { // == Skip comparison with non-cell items (headers and footers) == // if attributes.representedElementCategory != UICollectionElementCategory.Cell { continue } if let candAttrs = candidateAttributes { let a = attributes.center.x - proposedContentOffsetCenterX let b = candAttrs.center.x - proposedContentOffsetCenterX if fabsf(Float(a)) < fabsf(Float(b)) { candidateAttributes = attributes } } else { // == First time in the loop == // candidateAttributes = attributes continue } } return CGPoint(x : candidateAttributes!.center.x - halfWidth, y : proposedContentOffset.y) } } // Fallback return super.targetContentOffsetForProposedContentOffset(proposedContentOffset) } } 

Agregue esto como la subclass de UICollectionFlowLayout.