Volevo un comportamento simile un po 'indietro, e con l'aiuto di @Mike_M sono riuscito a capirlo. Sebbene ci siano molti, molti modi per farlo, questa particolare implementazione è creare un UICollectionViewLayout personalizzato.
codice qui sotto (GIST può essere trovato qui: https://gist.github.com/mmick66/9812223)
Ora è importante impostare la seguente: *yourCollectionView*.decelerationRate = UIScrollViewDecelerationRateFast
, questo impedisce alle cellule di essere saltato da un colpo rapido.
Che dovrebbe coprire parte 1 e 2.Ora, per la terza parte, è possibile incorporarla nella raccolta personalizzata View invalidando e aggiornando costantemente, ma è un po 'una seccatura se me lo chiedi. Quindi un altro approccio sarebbe quello di impostare CGAffineTransformMakeScale(,)
nello UIScrollViewDidScroll
in cui si aggiorna dinamicamente la dimensione della cella in base alla sua distanza dal centro dello schermo.
È possibile ottenere i IndexPath delle celle visibili della collectionView utilizzando [*youCollectionView indexPathsForVisibleItems]
e quindi ottenere le celle per questi indexPath. Per ogni cellula, calcolare la distanza del suo centro al centro di yourCollectionView
Il centro della CollectionView si possono trovare con questo metodo ingegnoso: CGPoint point = [self.view convertPoint:*yourCollectionView*.center toView:*yourCollectionView];
Ora impostare una regola, che se il centro della cellula è più lontano di x, la dimensione della cella è ad esempio la 'dimensione normale', chiamala 1. e più si avvicina al centro, più si avvicina al doppio della dimensione normale 2.
quindi tu possibile utilizzare la seguente idea if/else:
if (distance > x) {
cell.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
} else if (distance <= x) {
float scale = MIN(distance/x) * 2.0f;
cell.transform = CGAffineTransformMakeScale(scale, scale);
}
Quello che succede è che le dimensioni della cella seguiranno esattamente il tuo tocco. Fatemi sapere se avete altre domande mentre sto scrivendo la maggior parte di questo fuori di testa.
- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)offset
withScrollingVelocity:(CGPoint)velocity {
CGRect cvBounds = self.collectionView.bounds;
CGFloat halfWidth = cvBounds.size.width * 0.5f;
CGFloat proposedContentOffsetCenterX = offset.x + halfWidth;
NSArray* attributesArray = [self layoutAttributesForElementsInRect:cvBounds];
UICollectionViewLayoutAttributes* candidateAttributes;
for (UICollectionViewLayoutAttributes* attributes in attributesArray) {
// == Skip comparison with non-cell items (headers and footers) == //
if (attributes.representedElementCategory !=
UICollectionElementCategoryCell) {
continue;
}
// == First time in the loop == //
if(!candidateAttributes) {
candidateAttributes = attributes;
continue;
}
if (fabsf(attributes.center.x - proposedContentOffsetCenterX) <
fabsf(candidateAttributes.center.x - proposedContentOffsetCenterX)) {
candidateAttributes = attributes;
}
}
return CGPointMake(candidateAttributes.center.x - halfWidth, offset.y);
}
Ecco un esempio trovato su Github: https://github.com/ikemai/ScaledVisibleCellsCollectionView forse potrebbe aiutare :) – Lapinou
@Lapinou Ho dei problemi con questo nel mio progetto di Objective-C. Non riesco a far funzionare il ponte per il lavoro – evenodd
Hmmm ... Normalmente, è abbastanza facile. Guarda questo post: http://stackoverflow.com/questions/24206732/cant-use-swift-classes-inside-objective-c fammi sapere se funziona per te;) – Lapinou