iphone ipad resize calayer autoresize

iphone - constraints swift



CALayer autoresizing en iPhone/iPad: ¿Cómo? (5)

Estoy intentando crear una subclase UIView ("GradientView") que se llenará con un degradado de varios colores. Lo he implementado agregando un CAGradientLayer como una subcapa de la capa de UIView.

Se veía bien, pero cuando se giraba la pantalla, no cambiaba el tamaño de la capa de degradado. Al no tener la suerte de encontrar una propiedad BOOL en la capa para alternar, sobrescribí las vistas de diseño en GradientView.

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

Esto funciona, pero las cosas detrás de GradientView todavía están visibles durante la animación de rotación del dispositivo. ¿Cuál es la forma más fácil de "autorizar" que CAGradientLayer coincida con los límites de su capa principal para que la animación sea fluida (como en el caso de la automatización de UIView)?


En mi caso este trabajo:

[[[view.layer sublayers] objectAtIndex:gradientIndex] setFrame:view.bounds];


Me gustaría:

  1. Aumente el tamaño de su vista al máximo de cada dimensión en el código willRotateToInterfaceOrientation. (Por ejemplo, para un iPhone de 320x480, establezca la atenuación en 480x480).

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

Esto debería hacer que la vista sea lo suficientemente grande como para que, independientemente de cómo esté orientada durante la animación, cubra toda la pantalla. No será "suave", porque el gradiente tendrá que rotarse, pero al menos no verá detrás de la capa en el medio de la rotación.


Probablemente pueda salir adelante definiendo el método + layerClass en un UIView personalizado ...

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

Puedes inicializar la capa en viewDidLoad () (o donde sea) de tu controlador, algo como ...

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


Tenga en cuenta que devolver CAGradientLayer como la clase de capa solo funciona si establece el color de fondo de la vista en transparente. Deberá establecer el color de fondo de la capa si necesita un color que no sea transparente.


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