È possibile impostare la proprietà di velocità del livello (come in [Rotoava's Answer]) (https://stackoverflow.com/a/23146861/5271393) per cambiare il controllo della velocità dell'animazione. Il problema è che stai usando valori arbitrari perché non conosci la durata effettiva dell'animazione di inserimento.
Utilizzando this post è possibile capire qual è la durata predefinita dell'animazione.
newAnimationDuration = (1/layer.speed)*originalAnimationDuration
layer.speed = originalAnimationDuration/newAnimationDuration
Se si voleva fare lungo i 400ms di animazione, nel layout si farebbe:
- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewLayoutAttributes* attributes = [super finalLayoutAttributesForDisappearingItemAtIndexPath:indexPath];
//set attributes here
UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];
CGFloat originalAnimationDuration = [CATransaction animationDuration];
CGFloat newAnimationDuration = 0.4f;
cell.layer.speed = originalAnimationDuration/newAnimationDuration;
return attributes;
}
Nel mio caso ho avuto le cellule che potrebbero essere trascinati fuori dallo schermo e ho voluto cambiare la durata di l'animazione della cancellazione in base alla velocità del gesto pan.
Nel riconoscitore gesto (che dovrebbe essere parte della vostra vista collezione):
- (void)handlePanGesture:(UIPanGestureRecognizer *)sender
{
CGPoint dragVelocityVector = [sender velocityInView:self.collectionView];
CGFloat dragVelocity = sqrt(dragVelocityVector.x*dragVelocityVector.x + dragVelocityVector.y*dragVelocityVector.y);
switch (sender.state) {
...
case UIGestureRecognizerStateChanged:{
CustomLayoutClass *layout = (CustomLayoutClass *)self.collectionViewLayout;
layout.dragSpeed = fabs(dragVelocity);
...
}
...
}
Poi, nel tuo customLayout:
- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewLayoutAttributes* attributes = [super finalLayoutAttributesForDisappearingItemAtIndexPath:indexPath];
CGFloat animationDistance = sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
CGFloat originalAnimationDuration = [CATransaction animationDuration];
CGFloat newAnimationDuration = animationDistance/self.dragSpeed;
UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];
cell.layer.speed = originalAnimationDuration/newAnimationDuration;
return attributes;
}
Secondo la documentazione di Apple, "Durante l'animazione modifiche del layout, la tempistica dell'animazione e parametri sono controllati da vista collezione." Questo è in riferimento al metodo setCollectionView: animated: ma sospetto che lo stesso sia vero per la modifica dei limiti della vista di raccolta. Scusa non posso essere più di aiuto, sono bloccato sullo stesso problema. Sospetto che la risposta sia da qualche parte all'interno dell'oggetto UICollectionView stesso. – Ash