/ / Core Animation, mój kod zawodzi przy drugiej animacji -iOS - iOS, Core-Animation, Calayer, Caanimation

Core Animation, mój kod nie działa na drugiej animacji -iOS - iOS, Core-Animation, Calayer, Caanimation

Za każdym razem, gdy używam podstawowa animacja Mam kłopoty! Czy ktoś może mi pomóc z tym błędem? Przez wiele godzin byłam zajęta.

Animuję granice i położenie warstwy. Aby naprawdę zmienić warstwa modelowai nie tylko warstwa prezentacjiNauczyłem się, że należy ustalić pozycję i związać się z jej finałem toValues przed rozpoczęciem animacji.

Mój kod tworzy nowy CALayer-object, a następnie animuje swoją pozycję z ZA do b na czas 1s. To działa dobrze!

Później używam tego samego fragmentu kodu, aby przenieść warstwę z powrotem do jej pierwotnej pozycji (A), ponownie na czas 1 s. To robi nie praca! Warstwa się przesuwa, ale zdarza się bardzo szybko w wyniku domyślna animacja spowodowana liniami kodu, które przypisują pozycję i są powiązane z ich toValues.

Bardzo bym chciał Rozumiesz co jest nie tak z moim kodem! To jest literówka? Albo ja niezrozumiany główna animacja (ponownie)?

Oto mój kod. Pierwsza metoda tworzy nowy plik CALayer obiekt i dodaje go do super warstwy.

-(CALayer*) addLayerFromIm:(UIImage*) im{

CALayer *lay = [CALayer layer];
lay.bounds = CGRectMake(0,0, 100,100); // default values never used
lay.position = CGPointMake(0,0);
lay.contents = (id) im.CGImage;
lay.zPosition = 0;
[self.layer addSublayer:lay];
return lay;  }

Poniższa metoda dodaje animację do warstwy, a także zmienia jej właściwości pozycji i granic.

-(CALayer*) animateLayer:(CALayer*) lay fromRect:(CGRect)rcFrom toRect:(CGRect)rcTo duration:(float) duration{

[lay removeAllAnimations];

lay.position  = rcTo.origin;
lay.bounds    = CGRectMake( 0,0, rcTo.size.width,rcTo.size.height);

CABasicAnimation* animP = [CABasicAnimation animationWithKeyPath:@"position"];
animP.fromValue =[NSValue  valueWithCGPoint:rcFrom.origin];
animP.toValue =  [NSValue  valueWithCGPoint:rcTo.origin];
animP.fillMode =  kCAFillModeForwards;
animP.duration = duration;
animP.beginTime = CACurrentMediaTime();
animP.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
animP.removedOnCompletion = YES;
[lay addAnimation:animP forKey:nil];


CABasicAnimation* animB = [CABasicAnimation animationWithKeyPath:@"bounds"];
animB.fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, rcFrom.size.width, rcFrom.size.height)];
animB.toValue   = [NSValue valueWithCGRect:CGRectMake(0, 0, rcTo.size.width, rcTo.size.height)];
animB.fillMode = kCAFillModeForwards;
animB.duration = duration;
animB.beginTime = CACurrentMediaTime();
animB.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
animB.removedOnCompletion = YES;

[lay addAnimation:animB forKey:nil];

return lay; }

Oto jak warstwa jest tworzona i animowana (to działa dobrze)

UIImage* imDst = [UIImage imageNamed:@"connectionDst.png"];

CALayer *lay = [self animateLayer:[self addLayerFromIm:imDst] fromRect:rcA toRect:rcB duration:1.0];

Później próbuję przenieść warstwę z powrotem do A.

[self animateLayer:lay fromRect:rcB toRect:rcA duration:1.0];

Ale potem uruchamia się domyślna animacja i przesuwa warstwę w 0,2 s. Moje pytanie brzmi: co jest nie tak z moim kodem lub moim podejściem?

Odpowiedzi:

0 dla odpowiedzi № 1

Powiem, że to podejście jest trochę dziwne. Wygląda to jak automatycznie odwrócona animacja, którą można po prostu zaimplementować autoreverses własność CABasicAnimation. Możesz też wypróbować animację klatek kluczowych i animateWithDuration: funkcja włączona UIView.