Użyłem CAKeyframeAnimations do animowania właściwości warstwy transform.rotation
i transform.translation.x
, ale mam problem z nieuprawnionym animowaniem właściwości transform
. Mam warstwę, która musi animować się między dwoma stanami, a domyślna interpolacja CABasicAnimation jest całkowicie niepoprawna i nie podąża ścieżką, którą chcę. CAKeyframeAnimacja na ratunek, a przynajmniej tak myślałem. Każda próba animacji transform
przy użyciu CAKeyframeAnimation powoduje natychmiastowe przyciąganie widoku do ostatecznej transformacji, podczas gdy inne animacje działają. Jeśli usuniemy pierwszą połowę poniższej funkcji i pozwolę, aby moje zdarzenia "przekształcenia" używały CABasicAnimation na dole, animacja jest w porządku - ale z niepoprawnie interpolowanymi transformacjami po drodze.Jak animować CATransform3D za pomocą CAKeyframeAnimation?
Moja warstwa delegat wdrożył następujące:
- (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;
}
Moja przekształcić to tłumaczenie następnie obracać, ale myślę, że animacja grupa z osobne animacje klatek kluczowych animacji poprzez tłumaczenie i A Obrót spowodowałoby szalony miasto. Potwierdziłem, że rozmiar transformacji & jest poprawny dla wszystkich wartości p, które przechodzę, a p ściśle mieści się w zakresie od 0 do 1.
Próbowałem ustawić inną niż domyślną funkcję taktowania, próbowałem ustawienia szereg funkcji czasowych, pominąłem keyTImes, ustawiłem repeatCount na 0, removedOnCompletion = YES i fillMode of forward i bez efektu. Czy nie tworzę poprawnie animacji klatek kluczowych transformacji?
Czy mógłbyś wyjaśnić dokładny efekt, który próbujesz osiągnąć? Opisujesz to jako tłumaczenie, po którym następuje rotacja, ale z twojego kodu wygląda na to, że granice są również animowane - czy to prawda?Chcesz, aby warstwa się przesuwała, a następnie obracała, z granicami rosnącymi lub zmniejszającymi się w sposób ciągły w obu fazach animacji ruchu/obracania? – GSnyder
Dlaczego musi być ukryty? Ten kod wygląda na zhakowany. Jeśli chcesz mieć precyzyjną kontrolę, po prostu nie twórz animacji i nie dodawaj jej bezpośrednio do warstwy, o której mówisz, że już działasz? Zwróć także 'nil' z tej metody delegatów, jeśli chcesz, aby rzeczy używały domyślnej animacji. –