为CALayer的蒙版的蒙版设置动画

时间:2013-11-21 22:01:28

标签: ios objective-c animation core-animation

目标:
我正在绘制一个具有渐变的自定义形状。我还希望通过从左到右绘制来绘制此形状的动画。

问题:
下面的代码适用于iPad模拟器,但它不适用于运行iOS 7的iPad 4.有谁知道如何在设备上运行?是否有不同的方法来实现同样的结果?

我的代码说明:
我的代码使用3个CALayers工作(仅在模拟器上)。

  • gradientLayer拥有我的渐变。
  • shapeMaskLayer保留我的自定义形状。
  • animationMaskLayer设置了从左到右模拟绘图的路径

animationMaskLayer --masks--> shapeMaskLayer --masks--> gradientLayer

然后,我为animationMaskLayer的框架设置动画,为整个形状设置动画。

代码:

// Animation Mask Rects
CGPathRef leftStartingRectPath = CGPathCreateWithRect(CGRectMake(0, 0, 0, self.frame.size.height), 0);
CGPathRef fullViewRectPath = CGPathCreateWithRect(CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), 0);

// Animation Mask Layer
CAShapeLayer *animationMaskLayer = [CAShapeLayer layer];
animationMaskLayer.path = fullViewRectPath;
animationMaskLayer.fillColor = UIColor.blackColor.CGColor;

// Shape Mask Layer
CAShapeLayer *shapeMaskLayer = [CAShapeLayer layer];
shapeMaskLayer.path = CGPathCreateWithEllipseInRect(self.bounds, 0);
shapeMaskLayer.fillColor = [UIColor blueColor].CGColor;
shapeMaskLayer.mask = animationMaskLayer;

// Gradient Layer
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = self.bounds;
gradientLayer.colors = self.colors;
gradientLayer.mask = shapeMaskLayer;
mountainLayer.anchorPoint = pt(0, 0);
mountainLayer.position = pt(0, 0);
[self.layer addSublayer:gradientLayer];

// Left To Right Animation
CABasicAnimation *leftToRightAnimation = [CABasicAnimation animationWithKeyPath:@"path"];
leftToRightAnimation.duration = 0.5;
leftToRightAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
leftToRightAnimation.fromValue = (__bridge id)leftStartingRectPath;
leftToRightAnimation.toValue = (__bridge id)fullViewRectPath;
leftToRightAnimation.fillMode = kCAFillModeForwards;
leftToRightAnimation.removedOnCompletion = NO;
[animationMaskLayer addAnimation:leftToRightAnimation forKey:@"animatePath"];

// Memory Management
CGPathRelease(leftStartingRectPath);
CGPathRelease(fullViewRectPath);

1 个答案:

答案 0 :(得分:4)

动画面具的面具?我很惊讶甚至可以在模拟器中工作。

您是否尝试嵌套两个图层,父图层上有masksToBounds?然后,您可以在两个图层上设置一个独立的蒙版,外层将使用自己的蒙版有效地遮罩您的内层(由于masksToBounds)。哪个层获取哪个掩码可能无关紧要(因为你想要两个掩码的交集)。

使用您在问题中列出的代码,您只需添加一行,并注释掉一行以获得正确的功能:

self.layer.mask = animationMaskLayer;
//    shapeMaskLayer.mask = animationMaskLayer;