Definir el ángulo del gradiente usando CAGradientLayer

Estoy intentando dibujar gradiente angular usando CaGradientLayer . Sé que el ángulo se puede definir usando startPoint y endPoint . Puedo calcular estos puntos para algunos angularjs estándar como 0, 90, 180, 360, etc. Pero quiero formular estos puntos por un ángulo arbitrario. He intentado computar usando una trigonometría, pero no tuve éxito. ¿Alguien puede darme indicaciones sobre cómo calcular estos puntos por angularjs arbitrarios?

Aquí hay un método que crea una vista que permite la rotation de 360 ​​grados de su gradiente de dos colors en function de la input de un control deslizante (o cualquier cosa). El valor del control deslizante entrante (la variable "x" a continuación) está entre 0.0 y 1.0.

A 0.0 el gradiente es horizontal (con el color A en la parte superior y el color B a continuación), girando 360 grados hasta el valor 1.0 (idéntico al valor 0.0 o una rotation completa).

Por ejemplo, cuando x = 0.25, el color A se deja y el color B es el correcto. A 0.5, el color A está debajo y el color B está arriba, 0.75 el color A es el derecho y el color B el izquierdo. Gira en sentido antihorario de derecha a izquierda.

Toma cuatro arguments: frame, colorA, colorB y el valor de input (0-1).

 -(UIView *)gradientViewWithFrame:(CGRect)frame colourA:(UIColor *)A colourB:(UIColor *)B rotation:(float)x { //x is between 0 and 1, eg. from a slider, representing 0 - 360 degrees //colour A starts on top, with colour B below //rotations move anti-clockwise //1. create the colour view UIView * colourView = [UIView new]; colourView.frame = frame; //2. create the gradient layer CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame = colourView.bounds; gradient.colors = [NSArray arrayWithObjects:(id)[A CGColor], (id)[B CGColor], nil]; [colourView.layer insertSublayer:gradient atIndex:0]; //3. create coordinates float a = pow(sinf((2*M_PI*((x+0.75)/2))),2); float b = pow(sinf((2*M_PI*((x+0.0)/2))),2); float c = pow(sinf((2*M_PI*((x+0.25)/2))),2); float d = pow(sinf((2*M_PI*((x+0.5)/2))),2); //4. set the gradient direction [gradient setStartPoint:CGPointMake(a, b)]; [gradient setEndPoint:CGPointMake(c, d)]; return colourView; } 

Swift 3

 static func setGradient(view: UIView!,viewRadius: CGFloat!, color1: UIColor!, color2: UIColor!, angle: Double!, alphaValue: CGFloat!){ let gradient = CAGradientLayer() gradient.frame = CGRect(origin: CGPoint.zero, size: view.frame.size) gradient.colors = [color1.withAlphaComponent(alphaValue).cgColor, color2.withAlphaComponent(alphaValue).cgColor] let x: Double! = angle / 360.0 let a = pow(sinf(Float(2.0 * M_PI * ((x + 0.75) / 2.0))),2.0); let b = pow(sinf(Float(2*M_PI*((x+0.0)/2))),2); let c = pow(sinf(Float(2*M_PI*((x+0.25)/2))),2); let d = pow(sinf(Float(2*M_PI*((x+0.5)/2))),2); gradient.endPoint = CGPoint(x: CGFloat(c),y: CGFloat(d)) gradient.startPoint = CGPoint(x: CGFloat(a),y:CGFloat(b)) view.roundCorners([.topLeft, .bottomLeft], radius: viewRadius) view.layer.insertSublayer(gradient, at: 0) } 

Esto se basa en gran medida en la solución Sarthak Sharmas. Hice una extensión de UIView y pensé que la legibilidad y las conversiones de types podrían mejorarse un poco:

 extension UIView { func setGradient(colors: [CGColor], angle: Float = 0) { let gradientLayerView: UIView = UIView(frame: CGRect(x:0, y: 0, width: bounds.width, height: bounds.height)) let gradient: CAGradientLayer = CAGradientLayer() gradient.frame = gradientLayerView.bounds gradient.colors = colors let alpha: Float = angle / 360 let startPointX = powf( sinf(2 * Float.pi * ((alpha + 0.75) / 2)), 2 ) let startPointY = powf( sinf(2 * Float.pi * ((alpha + 0) / 2)), 2 ) let endPointX = powf( sinf(2 * Float.pi * ((alpha + 0.25) / 2)), 2 ) let endPointY = powf( sinf(2 * Float.pi * ((alpha + 0.5) / 2)), 2 ) gradient.endPoint = CGPoint(x: CGFloat(endPointX),y: CGFloat(endPointY)) gradient.startPoint = CGPoint(x: CGFloat(startPointX), y: CGFloat(startPointY)) gradientLayerView.layer.insertSublayer(gradient, at: 0) layer.insertSublayer(gradientLayerView.layer, at: 0) } } 

Agregue esto a un file Swift nuevo o relacionado, y todo lo que tiene que hacer es llamar a myView.setGradient(colors: gradientColorsArray) o myView.setGradient(colors: gradientColorsArray, angle: 90) .