2008-10-22 13 views
11

Si tengo dos UIColors, ¿cuál es la mejor manera de dibujar un degradado uniforme entre ellos en un área de tamaño arbitrario?Dibujando manualmente un gradiente en las aplicaciones de iPhone?

Supongo que crearía una subclase UIView y usaría los métodos de dibujo CG en el método drawRect. Simplemente no sé cuáles, o si hay algún escollo a tener en cuenta, como el rendimiento. ¿Alguien ha hecho esto?

+0

Ver esta respuesta: http://stackoverflow.com/questions/422066/gradients-on-uiview-and-uilabels-on-iphone/1931498 # 1931498 – Bill

Respuesta

20

Querrá usar CGGradient. Consulte el documento "CGGradient Reference" del Centro de desarrollo de iPhone.

+0

Bien, gracias. Me pregunto cómo me perdí eso ... –

+28

Gran esfuerzo allí, vinculando a los documentos. – mxcl

+1

Este enlace funciona mejor: 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];  
} 

No olvides agregar la biblioteca QuartzCore a tu proyecto.

+2

Me gusta mucho esta solución. Con código, en lugar de una referencia.En mi humilde opinión, debería obtener más votos. –

0

Para las vistas que atraen texto, como UILabel, UITextView y UITextField, debe agregar el degradado dentro del drawRect función. (vea esto post para un ejemplo).

Hay algunos grandes subclases de UILabel, UITextView, y UITextField que le permiten añadir un gradiente bastante facilidad (ver JBGradient on GitHub).

0

Solución idéntica a @Anton Chikin pero un poco más robusta. Observe la anulación de layerClass ... de esta manera, no tiene que preocuparse por establecer el marco y el marco se actualiza automáticamente tras la rotación & cambiar el tamaño.

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

} 

Si está utilizando IB, puede establecer las propiedades definidas por el usuario a través de "atributos de ejecución".

Si no está utilizando IB, use el otro inicializador.

3

La forma Swift añadir Gradiente es:

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() es una clase de ayuda para Swift para convertir a hex colorrgb color, muy recomendable.

+0

¿Qué es '" 000000 ".UIColor.CGColor'? – JSmyth

+0

@JSmyth Es una extensión de cadena de Swift que convierte cadenas de 6 dígitos en UIColor. Puedes encontrarlo fácilmente en github. –

+0

@ reza-rg Quiero decir que te pedí que menciones esto en tu respuesta. No todos usan esa extensión al final. Sugiero que agregue al menos un enlace a la extensión. Más que eso, la respuesta está bien, pero es realmente fácil ir con una forma estándar de crear instancias de colores por simplicidad (por ejemplo, 'UIColor.whiteColor(). CGColor') ya que la pregunta es sobre gradientes, no representación hexagonal de colores. Finalmente, 'UIColor()' no es una clase auxiliar, es un objeto incorporado. – JSmyth

0

hola puede utilizar siguiente para aplicar gradiente de vista

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