Sto cercando di implementare la prossima cosa curiosa: Ho un paio di punti e mi piacerebbe collegarli con onde sinusoidaliSine CAShapeLayer come una maschera di CALayer
metodo seguente restituisce la matrice di punti per rendendo trama:
- (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;
}
Dopo che creo lo speciale 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;
}
Successivo sto aggiungendo questo percorso utilizzando 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];
Così mi piacerebbe avere un'onda sinusoidale gradiente tra questi punti. Cosa c'è di sbagliato nelle mie azioni?
ideale:
Mi dispiace ma non capisco cosa intendi con "Mi piacerebbe avere un'onda sinusoidale sfumata tra questi punti". Puoi chiarire cosa intendi o forse anche mostrare un mockup (esempio fatto in un editor di immagini) di ciò che stai cercando di fare? –
Sicuro. L'attività consiste nel creare un grafico, il colore del punto del valore y dipende dall'altezza del valore (da viola a giallo, ad esempio). Ho deciso che il modo migliore per riempire la linea con tale gradiente è creare un gradiente con colori appropriati ed eseguire il metodo setMask utilizzando il sinha CAS creato. P.S. Ho bloccato il rendering con l'obiettivo principale. – x401om
Mascherare la sfumatura con il percorso tracciato? –