目标:
我正在绘制一个具有渐变的自定义形状。我还希望通过从左到右绘制来绘制此形状的动画。
问题:
下面的代码适用于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);
答案 0 :(得分:4)
动画面具的面具?我很惊讶甚至可以在模拟器中工作。
您是否尝试嵌套两个图层,父图层上有masksToBounds
?然后,您可以在两个图层上设置一个独立的蒙版,外层将使用自己的蒙版有效地遮罩您的内层(由于masksToBounds
)。哪个层获取哪个掩码可能无关紧要(因为你想要两个掩码的交集)。
使用您在问题中列出的代码,您只需添加一行,并注释掉一行以获得正确的功能:
self.layer.mask = animationMaskLayer;
// shapeMaskLayer.mask = animationMaskLayer;