2

Don't refer CABasicAnimation returns to the original position before the next animation and Objective-C - CABasicAnimation applying changes after animation? and CABasicAnimation rotate returns to original position i have tried.

below code does,bottom->top->goes left->back to it’s original position.
bottom->top->goes left->back to its original position.
I need bottom->top->goes left.bottom->top->goes left so on…

-(void)addUpDownAnimationForButton:(UILabel*)label
{
    CABasicAnimation * bottomAnimation ;
    bottomAnimation =[CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
    [bottomAnimation setValue:@"animation1" forKey:@"id"];
    bottomAnimation.delegate = self;
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:)];
    bottomAnimation.duration = 2.0;
    bottomAnimation.fromValue = [NSNumber numberWithFloat:13];
    bottomAnimation.toValue = [NSNumber numberWithFloat:-7];
    bottomAnimation.repeatCount = 0;
    bottomAnimation.fillMode = kCAFillModeForwards;
    bottomAnimation.removedOnCompletion = NO;
    [btnSpecialForListing.titleLabel.layer addAnimation:bottomAnimation forKey:@"transform.translation.y"];
}
- (void)animationDidStop:(CAAnimation *)theAnimation2 finished:(BOOL)flag
{
    if([[theAnimation2 valueForKey:@"id"] isEqual:@"animation1"]) {
        CABasicAnimation *moveAnimation;
        moveAnimation=[CABasicAnimation animationWithKeyPath:@"transform.translation.x"];
        moveAnimation.duration=3.5;
        moveAnimation.repeatCount=0;
        moveAnimation.autoreverses=NO;
        moveAnimation.fromValue=[NSNumber numberWithFloat:0];
        moveAnimation.toValue=[NSNumber numberWithFloat:-400];
        moveAnimation.removedOnCompletion = NO;
        moveAnimation.fillMode = kCAFillModeRemoved;
        [btnSpecialForListing.titleLabel.layer addAnimation:moveAnimation forKey:@"transform.translation.x"];
    } 
}

Any help would be greatly appreciated. Thanks !!

Community
  • 1
  • 1
V.D
  • 403
  • 1
  • 6
  • 22

2 Answers2

7

Have you tried this?

moveAnimation.fillMode = kCAFillModeForwards;
moveAnimation.removedOnCompletion = NO;

EDIT As far as I can see you can also use animateWithDuration which has a completion block. Example would be:

CGRect rect = btnSpecialForListing.titleLabel.frame;
[UIView animateWithDuration:2.0 animations:^{

 rect.origin.y = -7;
 btnSpecialForListing.titleLabel.frame = rect;

} completion:^(BOOL finished){

 [UIView animateWithDuration:3.5 animation:^{
 rect.origin.x = -400;
 btnSpecialForListing.titleLabel.frame = rect;
 }];

}];
Pancho
  • 4,099
  • 1
  • 21
  • 32
  • Yes,i did. but after completion of 1st cycle only moveAnimation works i.e text only goes left. but the code for bottomAnimation executes but doesn't display. – V.D May 22 '14 at 13:05
  • Well you have added moveAnimation to btnSpecialForListing.titleLabel.layer so what exactly you're trying to do? I don't really get it – Pancho May 22 '14 at 13:19
  • see,i have label on which i want to add animation which starts from bottom(bottomAnimation from -7 to -13 position),animation 1 complete then on completion of bottom animation or you can say when bottomAnimation stop our 2nd animation(moveAnimation) starts and goes left.but after completion of moveAnimation my text back to it's original position.and starts once again the same cycle. – V.D May 22 '14 at 13:26
  • you can try taking label with frame 0,450,320,30.and copy the above code.you will get an idea. – V.D May 22 '14 at 13:29
  • Thanks...but i got the error read-only variable isn't assignable in rect.origin.y = -7 line and no known class method error by using animateWithDuration method. I am using xcode 5.0 – V.D May 22 '14 at 13:52
  • Hey,It works like charm..You are my hero.. ;) Thank a lot for your valuable time. Cheers !! – V.D May 22 '14 at 14:03
2

Swift 4.2/5:

moveAnimation.fillMode = .forwards
moveAnimation.isRemovedOnCompletion = false
KlimczakM
  • 12,576
  • 11
  • 64
  • 83