Search code examples
iosobjective-ccore-animationcalayermask

CALayer animation to move from one point to another


I am trying to animate a sublayer on a root layer which is attached to a UIView in objective C ios. I have tried number of answers available here but the sublayer is fixed and not changing its position at all.

I have tried the following method to animate it :

    -(void)moveLayer:(CALayer*)layer to:(CGPoint)point with:(CGRect)bounds
    {
        CGMutablePathRef thePath = CGPathCreateMutable();
        CGPathMoveToPoint(thePath,NULL,74.0,74.0);
        
        
        CAKeyframeAnimation * theAnimation;
        
        // Create the animation object, specifying the position property as the key path.
        theAnimation=[CAKeyframeAnimation animationWithKeyPath:@"position"];
        theAnimation.path=thePath;
        theAnimation.duration=5.0;
        
        // Add the animation to the layer.
        [layer addAnimation:theAnimation forKey:@"position"];
    
    }

And also using

`
                    [featureLayer setFrame:oldRect];
                    
                    CGRect oldBounds = oldRect;
                    CGRect newBounds = faceRect;
                    
                    CABasicAnimation* revealAnimation = [CABasicAnimation animationWithKeyPath:@"bounds"];
                    revealAnimation.fromValue = [NSValue valueWithCGRect:oldBounds];
                    revealAnimation.toValue = [NSValue valueWithCGRect:newBounds];
                    revealAnimation.duration = 3.0;
                    
                    // Update the bounds so the layer doesn't snap back when the animation completes.
                    featureLayer.bounds = newBounds;
                    
                    [featureLayer addAnimation:revealAnimation forKey:@"revealAnimation"];
                    
                    
                    [self.previewLayer setMask:featureLayer];
`

If any one can help me out it will be great. Thanks in advance.

Edit 1

Just to be sure this is a mask image over the root layer, i want to animate the mask to move from one position to other but it is staying still.


Solution

  • You may try below code.

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        CAShapeLayer *shape = [CAShapeLayer new];
        shape.path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 50, 50)].CGPath;
        shape.fillColor = [UIColor redColor].CGColor;
        shape.position = CGPointMake(self.view.bounds.size.width / 2 - 25, 100);
        [self.view.layer addSublayer:shape];
    
        [self performSelector:@selector(doAnimation:) withObject:shape afterDelay:1];
        //[self performSelector:@selector(doKeyFrameAnimation:) withObject:shape afterDelay:1];
    }
    
    - (void)doAnimation:(CALayer*)layer {
        NSLog(@"%@",layer);
    
        CABasicAnimation *anim = [CABasicAnimation new];
        anim.duration = 2;
        anim.keyPath = @"position.y";
        anim.fromValue = @(layer.position.y);
        anim.toValue = @300;
    
        [layer addAnimation:anim forKey:@"move_down"]; 
    }
    
    // the KeyFrameAnimation way
    - (void)doKeyFrameAnimation:(CALayer*)layer {
    
        UIBezierPath *path = [UIBezierPath new];
        [path moveToPoint:layer.position];
        [path addLineToPoint:CGPointMake(layer.position.x, 300)];
    
        CAKeyframeAnimation *anim = [CAKeyframeAnimation new];
        anim.duration = 2;
        anim.keyPath = @"position";
        anim.path = path.CGPath;
    
        [layer addAnimation:anim forKey:@"move_down_by_keyframe"];
    }