Tôi đang cố gắng để thực hiện điều tò mò tiếp theo: Tôi có một vài dấu chấm và tôi muốn liên kết chúng với sóng sinSine CAShapeLayer như một chiếc mặt nạ của CALayer
phương pháp tiếp trả về mảng các dấu chấm cho làm cho cốt truyện:
- (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;
}
Sau đó tôi tạo ra đặc biệt 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;
}
Tiếp theo tôi thêm con đường này sử dụng 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];
Vì vậy, tôi muốn có sóng sin dốc giữa các điểm này. Chính xác những gì là sai trong hành động của tôi?
lý tưởng:
Tôi xin lỗi nhưng tôi không hiểu ý bạn là gì với "Tôi muốn có sóng sine dốc giữa các điểm này". Bạn có thể làm rõ những gì bạn có nghĩa là hoặc thậm chí có thể hiển thị một mockup (ví dụ được thực hiện trong một trình biên tập hình ảnh) của những gì bạn đang cố gắng để làm gì? –
Chắc chắn. Nhiệm vụ là để tạo ra một âm mưu, y-giá trị điểm màu phụ thuộc vào chiều cao giá trị (từ màu tím sang màu vàng, ví dụ). Tôi quyết định rằng cách tốt nhất để điền vào các dòng với gradient như vậy là tạo ra lớp gradient với màu sắc thích hợp và thực hiện phương pháp setMask bằng cách sử dụng tạo ra CAShapeLayer sin. P.S. Tôi ghim kết xuất với mục tiêu chính. – x401om
Mặt nạ gradient với đường nét vuốt ve? –