#import "TGDraggableCollectionViewFlowLayout.h" @implementation TGDraggableCollectionViewFlowLayout - (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath { if (itemIndexPath == nil) return nil; UICollectionViewLayoutAttributes *attributes = [super initialLayoutAttributesForAppearingItemAtIndexPath:itemIndexPath]; attributes.transform3D = CATransform3DMakeTranslation(0, 0, itemIndexPath.row + 1); attributes.zIndex = itemIndexPath.row + 1; return attributes; } - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)itemIndexPath { if (itemIndexPath == nil) return nil; UICollectionViewLayoutAttributes *attributes = [super layoutAttributesForItemAtIndexPath:itemIndexPath]; attributes.transform3D = CATransform3DMakeTranslation(0, 0, 1000 + itemIndexPath.row + 1); attributes.zIndex = 1000 + itemIndexPath.row + 1; return attributes; } - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { NSArray *originalAttributes = [super layoutAttributesForElementsInRect:rect]; if (self.destinationIndexPath == nil) { if (self.hiddenIndexPath == nil) return originalAttributes; for (UICollectionViewLayoutAttributes *layoutAttributes in originalAttributes) { if (layoutAttributes.representedElementCategory != UICollectionElementCategoryCell) continue; if ([layoutAttributes.indexPath isEqual:self.hiddenIndexPath]) layoutAttributes.hidden = true; } return originalAttributes; } for (UICollectionViewLayoutAttributes *layoutAttributes in originalAttributes) { if (layoutAttributes.representedElementCategory != UICollectionElementCategoryCell) continue; NSIndexPath *indexPath = layoutAttributes.indexPath; if ([indexPath isEqual:self.hiddenIndexPath]) layoutAttributes.hidden = true; if ([indexPath isEqual:self.destinationIndexPath]) { layoutAttributes.indexPath = self.sourceIndexPath; } else { if (indexPath.item <= self.sourceIndexPath.item && indexPath.item > self.destinationIndexPath.item) layoutAttributes.indexPath = [NSIndexPath indexPathForItem:indexPath.item - 1 inSection:indexPath.section]; else if (indexPath.item >= self.sourceIndexPath.item && indexPath.item < self.destinationIndexPath.item) layoutAttributes.indexPath = [NSIndexPath indexPathForItem:indexPath.item + 1 inSection:indexPath.section]; } } return originalAttributes; } @end