Получить indexPath ячейки в центре collectionView в swift?
Я пытался получить индекс ячейки в центре представления коллекции с помощью расширения uicollectionview, но я всегда получаю nil вместо индекса. Как я могу это исправить?
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
}
}
Тогда: в UIViewController в случайном методе у меня есть это:
if let centerCellIndexPath: NSIndexPath = collectionTemp!.centerCellIndexPath {
print(centerCellIndexPath)
} else {
println("nil")
}
Путь к индексу всегда равен нулю, и я не понимаю, почему, потому что ячейки отображаются в порядке, все нормально, кроме этого.
1 ответ:
Мне удалось решить мою проблему, используя пользовательский макет, который всегда держит ячейку в центре. Используя это, indexPath в центре никогда не может быть равен нулю.
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) } }
Добавьте это как подкласс UICollectionFlowLayout.