Ho usato CAKeyframeAnimations per animare le proprietà transform.rotation
e transform.translation.x
di un livello, ma ho difficoltà ad animare implicitamente la proprietà transform
. Ho un livello che deve animare tra due stati e l'interpolazione predefinita di CABasicAnimation è totalmente errata e non segue il percorso che voglio. CAKeyframeAnimazione in soccorso, o almeno così pensavo. Qualsiasi tentativo di animare transform
utilizzando un risultato CAKeyframeAnimation nella vista esegue immediatamente lo snap alla trasformazione finale mentre vengono eseguite le altre animazioni. Se rimuovo la prima metà della seguente funzione e lascia che i miei eventi di "trasformazione" utilizzino il CABasicAnimation in fondo, si anima bene, anche se con trasformazioni errate interpolate lungo la strada.Come faccio ad animare CATransform3Ds con CAKeyframeAnimation?
mio strato delegato ha assunto le seguenti:
- (id <CAAction>) actionForLayer:(CALayer *)layer forKey:(NSString *)event
{
if ([event isEqualToString:@"transform"])
{
CGSize startSize = ((CALayer *)self.layer.presentationLayer).bounds.size;
CGSize endSize = self.layer.bounds.size;
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:event];
animation.duration = 0.25;
NSMutableArray *values = [NSMutableArray array];
int stepCount = 10;
for (int i = 0; i < stepCount; i++)
{
CGFloat p = i/(float)(stepCount - 1);
CGSize size = [self interpolateBetweenSize:startSize andSize:endSize percentage:p];
CATransform3D transform = [self transformForSize:size];
[values addObject:[NSValue valueWithCATransform3D:transform]];
}
animation.values = values;
return animation;
}
// All other animations use this basic animation
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:event];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.removedOnCompletion = YES;
animation.fillMode = kCAFillModeForwards;
animation.duration = 0.25;
return animation;
}
la mia trasformazione è una conversione seguita da una rotazione, ma penso un'animazione di gruppo con le animazioni dei fotogrammi chiave separati animare attraverso una traduzione e una rotazione si tradurrebbe in folle cittadina. Ho confermato che la dimensione & transform è corretta per tutti i valori di p che passo però, e p varia strettamente da 0 a 1.
Ho provato a impostare una funzione di temporizzazione non predefinita, ho provato a impostare una serie di funzioni di temporizzazione, ho omesso il keyTImes, ho impostato un repeatCount di 0, rimossoOnCompletion = YES e un fillMode di forward e questo non ha avuto alcun effetto. Non sto creando correttamente l'animazione del fotogramma chiave di trasformazione?
Potresti forse chiarire l'effetto esatto che stai cercando di ottenere? Lo descrivi come una traduzione seguita da una rotazione, ma dal tuo codice sembra che anche i limiti si animino - è corretto?Vuoi che il livello si sposti, quindi ruoti, con i limiti che crescono o si restringono continuamente in entrambe le fasi dell'animazione di movimento/rotazione? – GSnyder
Perché deve essere implicito? Questo codice sembra hacky. Se vuoi un controllo a grana fine, perché non creare l'animazione e aggiungerla direttamente al livello, che dici di aver già lavorato? Restituisci anche 'nil' da quel metodo delegato se vuoi che le cose usino la loro animazione predefinita. –