2008-10-22 6 views
11

Wenn ich zwei UIColors habe, wie zeichne ich dann am besten einen gleichmäßigen Farbverlauf über einem beliebig großen Bereich auf?Manuelles Zeichnen eines Farbverlaufs in iPhone-Apps?

Ich vermute, Sie würden eine UIView-Unterklasse erstellen und die CG-Zeichenmethoden in der drawRect-Methode verwenden. Ich weiß nur nicht, welche, oder ob es irgendwelche Fallstricke gibt, auf die man achten sollte, wie die Leistung. Hat jemand das getan?

+0

diese Antwort Siehe: http://stackoverflow.com/questions/422066/gradients-on-uiview-and-uilabels-on-iphone/1931498 # 1931498 – Bill

Antwort

20

Sie möchten CGGradient verwenden. Siehe das iPhone Dev Center "CGGradient Reference" Dokument.

+0

Schön, danke. Ich frage mich, wie ich das verpasst habe ... –

+28

Große Anstrengung dort, Link zu den Dokumenten. – mxcl

+1

Dieser Link funktioniert besser: http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Conceptual/drawingquarz2d/Introduction/Introduction.html –

50
#import <QuartzCore/QuartzCore.h>  
- (void) setGradient { 
    CAGradientLayer *gradient = [CAGradientLayer layer]; 
    gradient.frame = self.view.bounds; 
    gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor blackColor] CGColor], nil]; 
    [self.view.layer insertSublayer:gradient atIndex:0];  
} 

Vergessen Sie nicht, Ihrem Projekt die QuartzCore-Bibliothek hinzuzufügen.

+2

Ich mag diese Lösung wirklich. Mit Code anstelle einer Referenz.IMHO sollte es mehr Up-Stimmen bekommen. –

0

Für Ansichten, den Text zu zeichnen, wie UILabel, UITextView und UITextField sollten Sie den Farbverlauf innerhalb derhinzufügen 0 Funktion. (Siehe dieses post für ein Beispiel).

Es gibt einige große Unterklassen von UILabel, UITextView und UITextField die Ihnen erlauben, einen Gradienten hinzufügen ziemlich leicht (siehe JBGradient on GitHub).

0

Gleiche Lösung wie @Anton Chikin aber ein wenig robuster. Beachten Sie die Überschreibung von layerClass ... auf diese Weise müssen Sie sich nicht um die Einstellung des Rahmens kümmern und der Rahmen wird automatisch bei der Drehung aktualisiert & Größe ändern.

Wenn Sie IB verwenden, können Sie die Eigenschaften über "Benutzerdefinierte Laufzeitattribute" festlegen.

Wenn Sie IB nicht verwenden, verwenden Sie den anderen Initialisierer.

3

Der Swift Weg Gradient hinzuzufügen ist:

var view : UIView = UIView(frame: CGRectMake(0, 0, 320, 100)) 
    var g : CAGradientLayer = CAGradientLayer() 
    g.frame = gradientView.bounds 
    g.colors = ["000000".UIColor.CGColor , "111111".UIColor.CGColor] 
    view.layer.insertSublayer(g, atIndex: 0) 

UIColor() ist eine Hilfsklasse für Swift hex color-rgb color zu konvertieren, sehr zu empfehlen.

+0

Was ist '" 000000 ".UIColor.CGColor'? – JSmyth

+0

@JSmyth Es ist eine Swift's String-Erweiterung, die 6-stellige Zeichenfolge in UIColor konvertiert. Sie können es leicht auf GitHub finden. –

+0

@ reza-rg Ich meine, ich habe Sie aufgefordert, dies in Ihrer Antwort zu erwähnen. Nicht jeder benutzt diese Erweiterung am Ende. Ich schlage vor, dass Sie der Erweiterung mindestens einen Link hinzufügen. Mehr als das, die Antwort ist in Ordnung, aber es ist wirklich einfach, mit einem Standard Weg der Instanziierung von Farben der Einfachheit halber zu gehen (zB 'UIColor.whiteColor(). CGColor'), da die Frage über Gradienten, nicht hex-Darstellung von ist Farben. Schließlich ist 'UIColor()' keine Hilfsklasse, sondern ein eingebautes Objekt. – JSmyth

0

hallo können Sie folgende verwenden, um auf Gradienten anwenden zu sehen

-(void)applyGradientEffecttoView:(UIView *)aView 
{ 
    // Create the colors 

    UIColor *darkOp = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:1.0]; 
    UIColor *lightOp =[UIColor colorWithRed:255.0f green:255.0f blue:255.0f alpha:0.0]; 

     // Create the gradient 
     CAGradientLayer *gradient = [CAGradientLayer layer]; 

     // Set colors 
     gradient.colors = [NSArray arrayWithObjects: 
         (id)lightOp.CGColor, 
         (id)darkOp.CGColor, 
         nil]; 
    gradient.locations = [NSArray arrayWithObjects: 
          [NSNumber numberWithFloat:0.0f], 
          [NSNumber numberWithFloat:0.5], 
          nil]; 

    // Set bounds 
    gradient.frame = aView.bounds; 

    // Add the gradient to the view 

    [aView.layer insertSublayer:gradient atIndex:0]; 
}