How to repeat animation from current state not fro

2019-08-31 05:51发布

问题:

I want to move my UIView from left to right in a repeatedly till the view not reached at the boundary of the right side. the below code running repeatedly but move only 5 points and repeat from starting point i want to repeat from last current state and the +5 to move further.

CGPoint pos = mover.center;
pos.x=25;
int count = 25;
[UIView beginAnimations:nil context:NULL];
pos.x=count;
[UIView setAnimationDuration:0];

[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationRepeatCount:INFINITY];

//[UIView setAnimationRepeatAutoreverses:YES];


   // CGPoint pos = mover.center;

    //pos.x +=5;
    count = (pos.x+=5);
    mover.center = pos;

i want to see object moving in +5 points interval. and i'm new in objective c and iphone so please help me as fast as possible . basically my task is move view on the border of the screen mean (left to right ,up to down ,right to left and down to up) means move view in in sequence and through border of the screen of simulator repeatedly. i hope your answer helpful to me and other who is new in this technology(iPhone). thank you very much.

回答1:

To move view from one position to another i would set its frame inside animation block. Something like this would help you:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    // `customView` is a UIView defined in .h file
    customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    customView.backgroundColor = [UIColor redColor];

    [self.view addSubview:customView];

    [self rotateViewInSelfBoundary];
}

-(void)rotateViewInSelfBoundary
{
    CGRect screen = [[UIScreen mainScreen] bounds];

    // Top Left to top right
    [UIView animateWithDuration:3.0f
                     animations:^{
                         [customView setFrame:CGRectMake(screen.size.width - customView.frame.size.width, 0, 100, 100)];
                                 }
                     completion:^(BOOL finished)
    {
        // Top right to bottom right
        [UIView animateWithDuration:3.0f
                         animations:^{
                             [customView setFrame:CGRectMake(screen.size.width - customView.frame.size.width, screen.size.height - customView.frame.size.height, 100, 100)];
                         }
                         completion:^(BOOL finished)
         {
             // bottom right to bottom left
             [UIView animateWithDuration:3.0f
                              animations:^{
                                  [customView setFrame:CGRectMake(0, screen.size.height - customView.frame.size.height, 100, 100)];
                              }
                              completion:^(BOOL finished)
              {
                  // bottom left to top left
                  [UIView animateWithDuration:3.0f
                                   animations:^{
                                       [customView setFrame:CGRectMake(0, 0, 100, 100)];
                                   }
                                   completion:^(BOOL finished)
                   {
                       // call the same function again.
                       [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(rotateViewInSelfBoundary) object:nil];
                       [self performSelector:@selector(rotateViewInSelfBoundary) withObject:nil afterDelay:0.0f];
                   }];
              }];
         }];
    }];
}

Screen shots:



回答2:

use UIViewAnimationOptionBeginFromCurrentState like

 [UIView animateWithDuration:1.0f
                      delay:2.0f
                    options:UIViewAnimationOptionRepeat | UIViewAnimationOptionBeginFromCurrentState
                 animations:^{
//your animation                   
  }
               completion:nil];


回答3:

If you want to move the view in a square, define the four CGPoint values it should animate between and then:

NSArray *values = @[[NSValue valueWithCGPoint:point0],
                    [NSValue valueWithCGPoint:point1],
                    [NSValue valueWithCGPoint:point2],
                    [NSValue valueWithCGPoint:point3],
                    [NSValue valueWithCGPoint:point0]];

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
animation.values = values;
animation.duration = 5.0;
animation.repeatCount = HUGE_VALF;
[mover.layer addAnimation:animation forKey:@"moveAroundBorder"];

This will take care of all of the moving of the view with no further intervention on your part.


If you want to use the iOS 7 block-based key-frame animation, it would be:

[UIView animateWithDuration:5.0 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{
    [UIView animateKeyframesWithDuration:5.0 delay:0.0 options:UIViewKeyframeAnimationOptionRepeat | UIViewKeyframeAnimationOptionCalculationModeLinear animations:^{
        [UIView addKeyframeWithRelativeStartTime:0.00 relativeDuration:0.25 animations:^{
            mover.center = point0;
        }];
        [UIView addKeyframeWithRelativeStartTime:0.25 relativeDuration:0.25 animations:^{
            mover.center = point1;
        }];
        [UIView addKeyframeWithRelativeStartTime:0.50 relativeDuration:0.25 animations:^{
            mover.center = point2;
        }];
        [UIView addKeyframeWithRelativeStartTime:0.75 relativeDuration:0.25 animations:^{
            mover.center = point3;
        }];
    } completion:nil];
} completion:nil];

Note the curious nesting of animateKeyframesWithDuration within the animateWithDuration. That's because the UIViewKeyframeAnimationOptionCalculationModeLinear curiously does not stop the "ease in / ease out" behavior, so you have to specify UIViewAnimationOptionCurveLinear on the outer animation block.