我正在尝试实施下一个奇怪的事情: 我有一些点,我想用正弦波链接它们
下一个方法返回用于制作绘图的点阵列:
- (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];
所以我想在这些点之间有渐变正弦波。我的行为究竟出了什么问题?
理想:
答案 0 :(得分:2)
程序运行正常 - 也就是说,它正在完全按照您要求它执行的操作。问题在于你告诉它(在你的代码中)不是你想要的(用你的问题中的单词和图片)。
首先,你做错了:你说closePath
。所以它正在关闭这条道路!这意味着,绘制波后,它将最后一个点用直线连接回第一个点,给出你所显示的形状。
你做错的第二件事:你没有操纵形状层。你正在制作一个vanilla CAShapeLayer并将其保留为默认值。好吧,默认情况是fillColor
是黑色的(没有strokeColor
)。你没有改变它。所以你得到的(不正确的)形状充满黑色,没有笔划,因此产生的面具是你(不正确)形状内部的形状,给出你所显示的渐变面具形状。