2009-07-17 8 views
1

Est-ce que quelqu'un sait comment créer un CGGradient qui comblera mon point de vue,
mon code actuel est-ce et remplir le UIView avec un rectangle rouge Je veux avoir un (de gradient noir au gris pour exemple) au lieu du rect:Comment créer un CGGradient pour ma sous-classe UIView?

- (void)drawRect:(CGRect)rect { 
    CGContextRef context=UIGraphicsGetCurrentContext(); 
    CGRect r; 
    r.origin.x=0.; 
    r.origin.y=0.; 
    r.size.width=rect.size.width; 
    r.size.height=rect.size.height; 
    CGContextSetRGBFillColor(context, 1., 0., 0., 1.); 
    CGContextFillRect (context,r); 
} 
+1

pointe tangentielle rapide: votre code d'installation rect sera beaucoup plus propre si vous utilisez CGRectMake. – smorgan

+1

Ou un initialiseur de style C99. 'CGRect r = {.origin = CGZeroRect, .size = rect.size};' –

+0

Merci pour les idées, je vais utiliser CGRectMake cela me semble sympa =) ... C99-style initialiseur est agréable mais pas assez de cacao pour moi: P – Fantattitude

Répondre

3

Dans my answer à this question, je fournis un code pour dessiner un gradient de brillance dans un UIView. Les couleurs et les positions de dessin peuvent être modifiées pour former le dégradé linéaire dont vous avez besoin.

1

utilisation CGGradientCreateWithColorComponents ou CGGradientCreateWithColors pour créer le gradient. (Ce dernier prend les objets CGColor.) Ensuite, utilisez CGContextDrawLinearGradient ou CGContextDrawRadialGradient pour le dessiner.

Un gradient linéaire s'étendra à l'infini dans au moins les deux directions perpendiculaires à la ligne du gradient. Un gradient radial s'étend à l'infini dans toutes les directions. Pour éviter que le dégradé ne se répande en dehors de votre vue, vous devrez probablement ajouter les limites de la vue au chemin de détourage à l'aide de CGContextClipToRect.

3

c'est une sous-classe où vous pouvez choisir les couleurs

.h

#import <UIKit/UIKit.h> 

@interface GradientView : UIView { 
    CGGradientRef gradient; 
} 

@property(nonatomic, assign) CGGradientRef gradient; 

- (id)initWithGradient:(CGGradientRef)gradient; 
- (id)initWithColor:(UIColor*)top bottom:(UIColor*)bot; 
- (void)setGradientWithColor:(UIColor*)top bottom:(UIColor*)bot; 
- (void)getRGBA:(CGFloat*)buffer; 

@end 

fichier .m

#import "GradientView.h" 

@implementation GradientView 

@synthesize gradient; 

- (id)initWithGradient:(CGGradientRef)grad { 
    self = [super init]; 
    if(self){ 
     [self setGradient:grad]; 
    } 
    return self; 
} 

- (id)initWithColor:(UIColor*)top bottom:(UIColor*)bot { 
    self = [super init]; 
    if(self){ 
     [self setGradientWithColor:top bottom:bot]; 
    } 
    return self; 
} 

- (void)setGradient:(CGGradientRef)g { 
    if(gradient != NULL && g != gradient){ 
     CGGradientRelease(gradient); 
    } 
    if(g != gradient){ 
     CGGradientRetain(g); 
    } 
    gradient = g; 
    [self setNeedsDisplay]; 
} 

- (void)setGradientWithColor:(UIColor*)top bottom:(UIColor*)bot { 
    CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB(); 
    CGFloat clr[8]; 
    [top getRGBA:clr]; 
    [bot getRGBA:clr+4] ; 
    CGGradientRef grad = CGGradientCreateWithColorComponents(rgb, clr, NULL, sizeof(clr)/(sizeof(clr[0])*4)); 
    [self setGradient:grad]; 
    CGColorSpaceRelease(rgb); 
    CGGradientRelease(grad); 
} 

- (void)getRGBA:(CGFloat*)buffer { 
    CGColorRef clr = [self CGColor]; 
    NSInteger n = CGColorGetNumberOfComponents(clr); 
    const CGFloat *colors = CGColorGetComponents(clr); 
    // TODO: add other ColorSpaces support 
    switch (n) { 
     case 2: 
      for(int i = 0; i<3; ++i){ 
       buffer[i] = colors[0]; 
      } 
      buffer[3] = CGColorGetAlpha(clr); 
      break; 
     case 3: 
      for(int i = 0; i<3; ++i){ 
       buffer[i] = colors[i]; 
      } 
      buffer[3] = 1.0; 
      break; 

     case 4: 
      for(int i = 0; i<4; ++i){ 
       buffer[i] = colors[i]; 
      } 
      break; 
     default: 
      break; 
    } 
} 

- (void)drawRect:(CGRect)rect { 
    CGContextRef c = UIGraphicsGetCurrentContext(); 
    CGContextDrawLinearGradient(c, gradient, CGPointMake(0, 0), CGPointMake(0, rect.size.height), 0); 
} 


- (void)dealloc { 
    CGGradientRelease(gradient); 
    [super dealloc]; 
} 


@end 
+0

Je suppose que la méthode - (void) getRGBA: devrait être dans une catégorie UIColor, non? – singingAtom

Questions connexes