Pregunta

Estoy intentando crear una subclase UIView ( "VistaGradiente") que se llenará con un gradiente de varios colores. He implementado mediante la adición de un CAGradientLayer como una sub-capa de la capa de UIView.

Se veía bien, pero cuando se hace girar la pantalla, no cambiar el tamaño de la capa de gradiente. Al no tener suerte para encontrar una propiedad BOOL en la capa de palanca, que hizo caso omiso de layoutSubviews en el VistaGradiente.

-(void)layoutSubviews {
    self.gradientLayer.frame = self.bounds;
}

Esto funciona, pero las cosas detrás de la VistaGradiente sigue siendo visible durante la animación de rotación del dispositivo. ¿Cuál es el modo más fácil de 'autoresize' que CAGradientLayer para que coincida con los límites de su capa principal para que la animación es suave (como por UIView tamaño automático)?

¿Fue útil?

Solución

Usted probablemente puede salirse con la definición del método + layerClass en una costumbre UIView ...

@implementation MyGradientView
+(Class) layerClass {
    return [CAGradientLayer class];
}
@end

Se puede inicializar la capa en viewDidLoad de su controlador () (o donde sea), algo así como ...

-(void)viewDidLoad {
    [super viewDidLoad];
    [(CAGradientLayer*)[mMyGradientViewInstance layer] setColors:nil];
}

Otros consejos

lo haría:

  1. Aumentar el tamaño de su vista a la máximo de cada dimensión en el código willRotateToInterfaceOrientation. . (Por ejemplo para un iPhone 320x480 - establecer las atenúa para 480x480)

  2. Set de los límites de acuerdo a la vista recién girada en la función didRotateFromInterfaceOrientation.

Esto debe hacerlo de modo que la vista es lo suficientemente grande como para que, independientemente de cómo se orienta durante la animación, cubrirá toda la pantalla. No va a ser "suave" -. Porque el gradiente tendrá que ser girado, pero al menos no va a ver detrás de la capa de en medio de la rotación

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

    CGRect b;

    if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation))b = CGRectMake(0, 0, 480, 320);
    else b = CGRectMake(0, 0, 320, 480);    

    [CATransaction begin];
    [CATransaction setValue:[NSNumber numberWithFloat:duration] forKey:kCATransactionAnimationDuration];
    [self.view.layer setBounds:b];
    [CATransaction commit];

}

Tenga en cuenta que volver CAGradientLayer como la clase de capa de sólo funciona si se establece el color de fondo de la vista a transparente. Tendrá que establecer el color de fondo si es necesario capa de un color que no sea transparente.

en mi caso este trabajo:

[[[view.layer sublayers] objectAtIndex:gradientIndex] setFrame:view.bounds];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top