2014-11-12 11 views
7

Ich versuche einen Winkelgradienten mit CaGradientLayer zu zeichnen. Ich weiß, Winkel kann mit startPoint und endPoint definiert werden. Ich kann diese Punkte für einige Standardwinkel wie 0, 90, 180, 360 usw. berechnen. Aber ich möchte diese Punkte für einen beliebigen Winkel formulieren. Ich habe versucht, es mit einer Trigonometrie zu berechnen, aber keinen Erfolg erzielt. Kann mir jemand Anweisungen geben, wie man diese Punkte für beliebige Winkel berechnen kann?Winkel des Gradienten mit CAGradiantLayer definieren

+0

'CAGradientLayer' unterstützen nur axiale (direktionale) Gradienten. –

+0

@ DavidRönnqvist Ich weiß das. Ich spreche nicht von radialen Gradienten. Ich versuche, einem axialen Gradienten einen Winkel zu geben. – blancos

+0

Sie fragen also nach der Trigonometrie, um die zwei Punkte bei einem Winkel herauszufinden? –

Antwort

6

Hier ist eine Methode, die eine Ansicht erstellt, die eine 360-Grad-Drehung des Zweifarben-Farbverlaufs basierend auf der Eingabe von einem Schieberegler (oder irgendetwas) ermöglicht. Der ankommende Schiebereglerwert ("x" Variable unten) liegt zwischen 0.0 und 1.0.

Bei 0,0 ist der Gradient horizontal (mit Farbe A oben und Farbe B unten) und dreht sich um 360 Grad auf den Wert 1,0 (identisch mit Wert 0.0 - oder eine volle Drehung).

z. Wenn x = 0,25 ist, ist die Farbe A links und die Farbe B ist rechts. Bei 0,5 ist die Farbe A unten und die Farbe B ist oben, 0,75 Farbe A ist rechts und Farbe B ist übrig. Es rotiert gegen den Uhrzeigersinn von rechts nach links.

Sie benötigt vier Argumente: frame, colourA, colourB und den Eingabewert (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; 
} 
3

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) 


} 
0

Dies wird auf Sarthak Sharmas Lösung basiert stark. Ich machte eine Erweiterung der UIView und ich dachte, die Lesbarkeit und Typkonvertierungen ein wenig verbessert werden könnte:

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) 
    } 

} 

das Hinzufügen einer neuen oder einer verwandten Swift-Datei und alles, was Sie tun müssen, ist anrufen entweder myView.setGradient(colors: gradientColorsArray) oder myView.setGradient(colors: gradientColorsArray, angle: 90) .