gpt4 book ai didi

ios - Sine CAShapeLayer 作为 CALayer 的 mask

转载 作者:可可西里 更新时间:2023-11-01 04:46:42 25 4
gpt4 key购买 nike

我正在尝试实现下一件奇怪的事情:我有几个点,我想将它们与正弦波联系起来

下一个方法返回用于绘制绘图的点数组:

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

最佳答案

该程序运行正常 - 也就是说,它完全按照您的指示进行操作。问题是你告诉它做什么(在你的代码中)不是你说你想要的(在你的问题中的文字和图片中)。

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

你做错的第二件事:你没有操纵形状层。您正在制作一个 Vanilla CAShapeLayer 并将其保留为默认值。嗯,默认情况下 fillColor 是黑色的(没有 strokeColor)。你没有改变它。因此,您得到的(不正确的)形状用黑色填充,没有描边,因此生成的 mask 是您(不正确的)形状内部的形状,给出了您显示的渐变 mask 形状。

关于ios - Sine CAShapeLayer 作为 CALayer 的 mask ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22986815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com