逐渐减少CAShapeLayer半径

时间:2012-10-09 05:17:37

标签: iphone mask cabasicanimation cakeyframeanimation cashapelayer

enter image description here

我有一个像上面一样的UIImageView图像,所以我要做的就是逐渐减少并增加图像的形状。

为了实现上述任务,显然我必须应用蒙版,所以我创建了一个圆形的CAShapeLayer并添加到UIImageView图层,如果我改变我的半径,它将只显示半径的图像量。

我的问题是如何应用动画,以便以动画形式显示。请指导我,我无法通过关键帧动画实现。

以下是屏蔽半径的代码。

// Set up the shape of the circle
int rChange = 0; // Its doing proper masking while changing this value
int radius = 123.5-rChange;

CAShapeLayer *circle = [CAShapeLayer layer];
// Make a circular shape
circle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0+rChange, 0+rChange, 2.0*radius, 2.0*radius)
                                         cornerRadius:radius].CGPath;

// Configure the apperence of the circle
[circle setFillColor:[[UIColor blackColor] CGColor]];    
[[self.originalImageView layer] setMask:circle];
self.originalImageView.layer.masksToBounds = YES;

其中123.5是图像的最大半径 和originalImageView是myUIImageView

1 个答案:

答案 0 :(得分:4)

如果您只想显示一个带有动画变化半径的棕色圆圈,我建议进行两项更改:

  1. 不要打扰图像。只需使用CAShapeLayer并将其fillColor设置为棕色。

  2. 将图层的路径设置为一个宽度和高度为1磅的圆。然后使用CAShapeLayer的{​​{1}}来改变大小。您可以为transform

  3. 设置动画

    例如,创建如下图层:

    transform

    circleLayer.position = CGPointMake(CGRectGetMidX(bounds),CGRectGetMidY(bounds));

    CGRect bounds = self.view.bounds;
    
    circleLayer = [CAShapeLayer layer];
    circleLayer.fillColor = [UIColor brownColor].CGColor;
    

    然后你可以像这样改变它的大小:

    // Create a circle with 1-point width/height.
    circleLayer.path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 1, 1)].CGPath;
    
    // Use the layer transform to scale the circle up to the size of the view.
    [circleLayer setValue:@(bounds.size.width) forKeyPath:@"transform.scale"];
    

    这将使用默认参数隐式(自动)设置大小更改的动画。如果要使用不同的动画参数,可以显式地为变换设置动画:

    [circleLayer setValue:@(newSize) forKeyPath:@"transform.scale"];