2008-10-22 5 views
11

Se ho due UIColors, qual è il modo migliore per disegnare un gradiente uniforme tra di loro su un'area di dimensioni arbitrarie?Disegnare manualmente una sfumatura nelle app per iPhone?

Immagino che si crei una sottoclasse UIView e si utilizzino i metodi di disegno CG nel metodo drawRect. Solo non so quali, o se ci sono delle insidie ​​a cui prestare attenzione, come le prestazioni. Qualcuno ha fatto questo?

+0

Vai a questa risposta: http://stackoverflow.com/questions/422066/gradients-on-uiview-and-uilabels-on-iphone/1931498 # 1931498 – Bill

risposta

20

Dovrai utilizzare CGGradient. Vedi il documento Dev Center per iPhone "CGGradient Reference".

+0

Bello, grazie. Mi chiedo come mi sono perso ... –

+28

Grande sforzo lì, il collegamento ai documenti. – mxcl

+1

Questo collegamento funziona meglio: 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];  
} 

Non dimenticare di aggiungere la libreria QuartzCore al progetto.

+2

Mi piace molto questa soluzione. Con codice, invece di un riferimento.IMHO dovrebbe ottenere più voti positivi. –

0

Per le viste che disegnano il testo, come ad esempio UILabel, UITextView e UITextField, è necessario aggiungere il gradiente all'interno dello drawRect funzione. (vedere questo post per un esempio).

Ci sono alcuni grandi sottoclassi di UILabel, UITextView, e UITextField che consentono di aggiungere una sfumatura piuttosto facilmente (vedi JBGradient on GitHub).

0

Soluzione Same-ish come @Anton Chikin ma un po 'più robusta. Nota l'override di layerClass ... in questo modo, non devi preoccuparti di impostare il frame e il frame viene aggiornato automaticamente al momento della rotazione & ridimensionamento.

class GradientView: UIView { 

    var colorA : UIColor = UIColor.greenColor() { 
     didSet { updateGradient() } 
    } 
    var colorB : UIColor = UIColor.blueColor() { 
     didSet { updateGradient() } 
    } 

    override class func layerClass() -> AnyClass { 
     return CAGradientLayer.self 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     updateGradient() 
    } 

    func updateGradient() { 
     if let gLayer = layer as? CAGradientLayer { 
      gLayer.colors = [colorA.CGColor, colorB.CGColor] 
     } 
    } 

} 

Se si utilizza IB, è possibile impostare le proprietà tramite "Attributi runtime definiti dall'utente".

Se non si utilizza IB, utilizzare l'altro inizializzatore.

3

Il modo più rapido per aggiungere gradiente è:

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() è una classe di supporto per la Swift per convertire hex color-rgb color, altamente consigliato.

+0

Cosa c'è '" 000000 ".UIColor.CGColor'? – JSmyth

+0

@JSmyth È un'estensione di stringa di Swift che converte una stringa da 6 cifre in UIColor. Puoi facilmente trovarlo su github. –

+0

@ reza-rg Voglio dire, ti ho suggerito di menzionarlo nella tua risposta. Alla fine non tutti usano questa estensione. Ti suggerisco di aggiungere almeno un link all'estensione. Inoltre, la risposta è soddisfacente, ma è semplicissimo utilizzare un metodo standard di creazione di istanze di colori per semplicità (ad esempio 'UIColor.whiteColor(). CGColor') in quanto la domanda riguarda i gradienti, non la rappresentazione esadecimale di colori. Infine, 'UIColor()' non è una classe helper, è un oggetto built-in. – JSmyth

0

hi è possibile utilizzare in seguito per applicare gradiente in mostra

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