CALayer生成其内容的方式会影响其缩放动画吗?

时间:2015-05-07 13:24:15

标签: ios animation

@interface CircleRevealLayer : CALayer

@end

@implementation CircleRevealLayer

- (instancetype)init
{
    if (self = [super init]) {
        [self setNeedsDisplay];
        [self displayIfNeeded];
    }

    return self;
}

- (void)display
{

    self.contents = (__bridge id)([self maskImage].CGImage);

    self.contentsGravity = kCAGravityCenter;
}

- (UIImage *)maskImage
{
    static UIImage *mask = nil;

    if (!mask) {
        UIGraphicsBeginImageContext(CGSizeMake(SCREEN_WIDTH, SCREEN_HEIGHT));

        UIBezierPath* bezierPath = UIBezierPath.bezierPath;
        [bezierPath moveToPoint: CGPointMake(209.5, 368)];
        [bezierPath addCurveToPoint: CGPointMake(207, 370.5) controlPoint1: CGPointMake(208.12, 368) controlPoint2: CGPointMake(207, 369.12)];
        [bezierPath addCurveToPoint: CGPointMake(209.5, 373) controlPoint1: CGPointMake(207, 371.88) controlPoint2: CGPointMake(208.12, 373)];
        [bezierPath addCurveToPoint: CGPointMake(212, 370.5) controlPoint1: CGPointMake(210.88, 373) controlPoint2: CGPointMake(212, 371.88)];
        [bezierPath addCurveToPoint: CGPointMake(210.98, 368.49) controlPoint1: CGPointMake(212, 369.67) controlPoint2: CGPointMake(211.6, 368.94)];
        [bezierPath addCurveToPoint: CGPointMake(209.5, 368) controlPoint1: CGPointMake(210.57, 368.18) controlPoint2: CGPointMake(210.05, 368)];
        [bezierPath closePath];
        [bezierPath moveToPoint: CGPointMake(411, 0)];
        [bezierPath addCurveToPoint: CGPointMake(411, 736) controlPoint1: CGPointMake(411, 0) controlPoint2: CGPointMake(411, 736)];
        [bezierPath addLineToPoint: CGPointMake(-3, 736)];
        [bezierPath addLineToPoint: CGPointMake(-3, 0)];
        [bezierPath addLineToPoint: CGPointMake(411, 0)];
        [bezierPath addLineToPoint: CGPointMake(411, 0)];
        [bezierPath closePath];
        [UIColor.grayColor setFill];
        [bezierPath fill];

        mask = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();


        //mask = [UIImage imageNamed:@"mask.PNG"];
    }

    return mask;
}

@end






@interface CircleRevealView : UIView

@end

@implementation CircleRevealView

+ (Class)layerClass{
    return [CircleRevealLayer class];
}

@end

然后,我这样创建它:

_maskView = [[CircleRevealView alloc] initWithFrame:self.view.bounds];

_maskView.frame = self.view.bounds;

并添加缩放动画:

POPSpringAnimation *springAnimation = [POPSpringAnimation animation];
springAnimation.property = [POPAnimatableProperty propertyWithName:kPOPViewScaleXY];
springAnimation.toValue=[NSValue valueWithCGPoint:CGPointMake(80, 80)];
springAnimation.velocity=[NSValue valueWithCGPoint:CGPointMake(1, 1)];       // change of value units per second
springAnimation.springBounciness=20;    // value between 0-20 default at 4
springAnimation.springSpeed=3;
springAnimation.name=@"scaleXY1";
springAnimation.delegate=self;
[_maskView pop_addAnimation:springAnimation forKey:@"scaleXY1"];

mask.PNG只是一个白色图像,中间有一个洞。

当我使用UIBezierPath绘制内容并将其分配给图层时,缩放动画似乎从图层的左上角开始; 但如果我改为使用图像,则缩放动画似乎是从它的中心发生的。

我想要的是使用Core Graphics生成动态内容并像使用mask.PNG

那样缩放图层

更新: UIBezierPath enter image description here

mask.PNG enter image description here

mask.PNG是使用PaintCode从UIBezierPath代码生成的。

0 个答案:

没有答案