5

Ich habe versucht, den Index einer Zelle in der Mitte einer Sammlung anzuzeigen, indem Sie eine Erweiterung von uicollectionview verwenden, aber ich bekomme immer Null anstelle des Index. Wie kann ich das beheben?Holen Sie den IndexPfad der Zelle in der Mitte von CollectionView in Swift?

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

dann: in einem UIViewController in einer zufälligen Methode Ich habe dies:

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

der Index Pfad immer gleich Null ist, und ich verstehe es nicht, warum, weil die Zellen, um anzuzeigen, Alles ist gut außer diesem.

+1

irgendwelche Updates zu diesem Thema? –

Antwort

2

Ich habe es geschafft, mein Problem zu lösen, indem ich ein benutzerdefiniertes Layout verwende, das immer eine Zelle in der Mitte hält. Damit kann der indexPath in der Mitte niemals Null sein.

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

Fügen Sie dies als Unterklasse von UICollectionFlowLayout hinzu.