正弦CAShapeLayer作为CALayer的面具

时间:2014-04-10 11:30:52

标签: ios core-graphics uibezierpath cashapelayer

我正在尝试实施下一个奇怪的事情: 我有一些点,我想用正弦波链接它们

下一个方法返回用于制作绘图的点阵列:

- (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;
}

之后我创建了特殊的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添加此路径:

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];

this is what I have in the end

所以我想在这些点之间有渐变正弦波。我的行为究竟出了什么问题?

理想: enter image description here

1 个答案:

答案 0 :(得分:2)

程序运行正常 - 也就是说,它正在完全按照您要求它执行的操作。问题在于你告诉它(在你的代码中)不是你想要的(用你的问题中的单词和图片)。

首先,你做错了:你说closePath。所以它正在关闭这条道路!这意味着,绘制波后,它将最后一个点用直线连接回第一个点,给出你所显示的形状。

你做错的第二件事:你没有操纵形状层。你正在制作一个vanilla CAShapeLayer并将其保留为默认值。好吧,默认情况是fillColor是黑色的(没有strokeColor)。你没有改变它。所以你得到的(不正确的)形状充满黑色,没有笔划,因此产生的面具是你(不正确)形状内部的形状,给出你所显示的渐变面具形状。