正弦CAShapeLayer作为CALayer的掩码

我试图实现下一个好奇的事情:我有几个点,我想把他们与正弦波

下一个方法返回用于绘制的点arrays:

- (NSArray *)plotPointsBetweenPoint:(CGPoint)pointA andPoint:(CGPoint)pointB { double H = fabs(pointB.y - pointA.y); double L = fabs(pointB.x - pointA.x); NSInteger granularity = 40; NSMutableArray *array = [NSMutableArray arrayWithCapacity:granularity + 1]; for (int i = 0; i <= granularity; ++i) { CGFloat x = M_PI*(float)i/(granularity); CGFloat y = -cosf(x); CGFloat multiplier = pointA.y > pointB.y ? 1 : -1; CGPoint newPoint = CGPointMake(pointA.x + L*(float)i/granularity, pointA.y - multiplier*H*(1.0 + y)/2.0); [array addObject:[NSValue valueWithCGPoint:newPoint]]; } return array; } 

之后,我创build了特殊的UIBezierPath

 - (UIBezierPath *)sineWaveWithPoints:(NSArray *)points { UIBezierPath *path = [[UIBezierPath alloc] init]; NSMutableArray *array = [NSMutableArray array]; for (int i = 0; i < points.count - 1; ++i) { [array addObjectsFromArray:[self plotPointsBetweenPoint:[points[i] CGPointValue] andPoint:[points[i+1] CGPointValue]]]; } [path moveToPoint:[array[0] CGPointValue]]; for (NSValue *value in array) { CGPoint point = [value CGPointValue]; [path addLineToPoint:point]; } [path closePath]; path.lineWidth = 2.0; [path stroke]; return path; } 

接下来,我使用CAShapeLayer添加此path:

 CAGradientLayer *gradientLayer = [self gradientLayer]; CAShapeLayer *maskLine = [CAShapeLayer layer]; maskLine.path = [self sineWaveWithPoints:pointsArray].CGPath; maskLine.lineWidth = self.plotWidth; gradientLayer.mask = maskLine; [self.view.layer addSublayer:gradientLayer]; 

这是我最后的结果

所以我想在这点之间有渐变的正弦波。 我的行为到底是什么错误?

理想: 在这里输入图像说明

该程序的行为是正确的 – 也就是说,它正在做你正在做的事情。 问题是你要告诉它做什么(在你的代码中)并不是你想说的(用你的问题的话来说)。

首先你做错了:你说closePath 。 所以它正在closurespath! 这意味着,绘制了波形后,它将最后一个点用直线连接回第一个点,从而给出您展示的形状。

第二件事你做错了:你无法操纵形状图层。 您正在制作一个香草CAShapeLayer并将其保留为默认值。 那么,默认是fillColor是黑色的(也没有strokeColor )。 你没有改变这一点。 所以你得到了你的(不正确的)形状充满了黑色,没有中风,因此得到的面具是你的(不正确的)形状的内部形状,给你的渐变掩模形状。