Abhiram
Abhiram

Reputation: 247

Unable to set image for cashape layer

1.i have created CAshapelayer and also inserted one lable sucessfully in CAshapelayer,but now i'm trying to set image in layer but it was not working.

  1. help me to make Zoom in animation for this layer.

         CAShapeLayer *circleLayer = [CAShapeLayer layer];
     [circleLayer setPath:[[UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 250, 100, 100)] CGPath]];
    circleLayer.contents = (id)[[UIImage imageNamed:@"001-forward.png"] CGImage];
    circleLayer.contentsGravity=kCAGravityResize;
      //  circleLayer.masksToBounds = YES;
    [circleLayer setStrokeColor:[[UIColor brownColor] CGColor]];
    [circleLayer setFillColor:[[UIColor clearColor] CGColor]];
    
     [[self.view layer] addSublayer:circleLayer];
    CATextLayer *label = [[CATextLayer alloc] init];
    [label setFont:@"Helvetica-Bold"];
    [label setFontSize:15];
    [label setFrame:CGRectMake(50,300, 100, 50)];
    [label setString:@"GM"];
    [label setAlignmentMode:kCAAlignmentCenter];
    [label setForegroundColor:[[UIColor greenColor] CGColor]];
    
    [circleLayer addSublayer:label];
    

Upvotes: 1

Views: 87

Answers (2)

Vitaly Migunov
Vitaly Migunov

Reputation: 4457

Try this

CAShapeLayer *circleLayer = [CAShapeLayer layer];
[circleLayer setPath:[[UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 250, 100, 100)] CGPath]];
circleLayer.bounds = [[UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 250, 100, 100)] bounds];
circleLayer.masksToBounds = YES;
[circleLayer setStrokeColor:[[UIColor brownColor] CGColor]];
//Use .png if you store your image outside of .xcassets
circleLayer.fillColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"001-forward.png"]].CGColor;

[[self.view layer] addSublayer:circleLayer];

Upvotes: 0

Reinier Melian
Reinier Melian

Reputation: 20804

The main issue here is that you can´t add an UIImage as content for CAShape Layer,as you can see here UIImage as CAShapeLayer contents so I had modified your code adding the Image into CALayer and adding that layer to your circleLayer

CGRect frame = CGRectMake(50, 250, 100, 100);
// Do any additional setup after loading the view, typically from a nib.
CAShapeLayer *circleLayer = [CAShapeLayer layer];
[circleLayer setPath:[[UIBezierPath bezierPathWithOvalInRect:frame] CGPath]];
circleLayer.contentsGravity=kCAGravityResize;
//  circleLayer.masksToBounds = YES;
[circleLayer setStrokeColor:[[UIColor brownColor] CGColor]];
//[circleLayer setFillColor:[[UIColor clearColor] CGColor]];

[[self.view layer] addSublayer:circleLayer];
CATextLayer *label = [[CATextLayer alloc] init];
[label setFont:@"Helvetica-Bold"];
[label setFontSize:15];
[label setFrame:CGRectMake(50,300, 100, 50)];
[label setString:@"GM"];
[label setAlignmentMode:kCAAlignmentCenter];
[label setForegroundColor:[[UIColor greenColor] CGColor]];

CALayer * imageLayer = [CALayer layer];
[imageLayer setContents: (__bridge id _Nullable)([[UIImage imageNamed:@"test"] CGImage])];
imageLayer.frame = frame; // Define a frame
imageLayer.contentsGravity=kCAGravityResize;

CAShapeLayer *maskLayer = [CAShapeLayer layer];
[maskLayer setPath:[[UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, frame.size.width, frame.size.height)] CGPath]];
imageLayer.mask = maskLayer;

[circleLayer addSublayer:imageLayer];
[circleLayer addSublayer:label];

enter image description here

Upvotes: 1

Related Questions