2008-10-22 4 views
11

Si j'ai deux UIColors, quelle est la meilleure façon de dessiner un gradient uniforme entre eux sur une zone de taille arbitraire?Dessiner manuellement un dégradé dans les applications iPhone?

Je suppose que vous créez une sous-classe UIView et utilisez les méthodes de dessin CG dans la méthode drawRect. Je ne sais pas lesquels, ou s'il y a des pièges à surveiller, comme la performance. Est-ce que quelqu'un a fait ça?

+0

Voir cette réponse: http://stackoverflow.com/questions/422066/gradients-on-uiview-and-uilabels-on-iphone/1931498 # 1931498 – Bill

Répondre

20

Vous devez utiliser CGGradient. Voir le document "CGGradient Reference" du centre de développement iPhone. N'oubliez pas d'ajouter la bibliothèque QuartzCore à votre projet.

+0

Bien, merci. Je me demande comment j'ai raté ça ... –

+28

Beaucoup d'efforts là-bas, en lien avec les docs. – mxcl

+1

Ce lien fonctionne mieux: http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/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];  
} 

N'oubliez pas d'ajouter la bibliothèque QuartzCore à votre projet.

+2

J'aime vraiment cette solution. Avec code, au lieu d'une référence.À mon humble avis, il devrait obtenir plus de votes. –

0

Pour les vues qui attirent le texte, tels que UILabel, UITextView, et UITextField, vous devez ajouter le dégradé à l'intérieur du drawRect fonction. (voir ce post pour un exemple).

Il y a quelques sous-classes de UILabel, UITextView et UITextField qui vous permettent d'ajouter un dégradé assez facilement (voir JBGradient on GitHub).

0

Même solution que @Anton Chikin mais un peu plus robuste. Notez le remplacement de layerClass ... de cette façon, vous n'avez pas à vous soucier de définir le cadre et le cadre est automatiquement mis à jour lors de la rotation & redimensionner. Si vous utilisez IB, vous pouvez définir les propriétés via "Attributs d'exécution définis par l'utilisateur".

Si vous n'utilisez pas IB, utilisez l'autre initialiseur.

3

La façon dont Swift ajouter est dégradé:

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() est une classe d'aide pour Swift convertir hex color-rgb color, fortement recommandé.

+0

Qu'est-ce que '" 000000 ".UIColor.CGColor'? – JSmyth

+0

@JSmyth C'est une extension de chaîne de Swift qui convertit une chaîne de 6 chiffres en UIColor. Vous pouvez facilement le trouver sur github. –

+0

@ reza-rg Je veux dire que je vous ai demandé de le mentionner dans votre réponse. Tout le monde n'utilise pas cette extension à la fin. Je vous suggère d'ajouter au moins un lien vers l'extension. Plus que cela, la réponse est bien, mais il est vraiment facile d'aller avec une méthode standard d'instanciation des couleurs par souci de simplicité (par exemple 'UIColor.whiteColor(). CGColor') car la question concerne les gradients, pas la représentation hexadécimale de couleurs. Finalement, 'UIColor()' n'est pas une classe auxiliaire, c'est un objet intégré. – JSmyth

0

Salut, vous pouvez utiliser ci-dessous pour appliquer un gradient sur la vue

-(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]; 
}