¿Cómo cambiar el tamaño de CAGradientLayer después de la rotation?

Estoy agregando un CAGradientLayer a una vista. Cuando la vista se cambia automáticamente de tamaño (por ejemplo, después de una rotation), la capa de degradado no cambia de tamaño. ¿Se puede configurar el gradiente para cambiar el tamaño del mismo igual que la vista? Tenga en count también que estoy usando restricciones de layout automático en la vista.

Esto es lo que estoy haciendo:

  CAGradientLayer *gradientLayer = [CAGradientLayer layer]; gradientLayer.frame = CGRectMake(0.0, 0.0, frame.size.width, frame.size.height); gradientLayer.colors = [NSArray arrayWithObjects: (id)[[UIColor colorWithRed:255.0/255.0f green:255.0/255.0f blue:255.0/255.0f alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:233.0/255.0f green:233.0/255.0f blue:233.0/255.0f alpha:1.0f] CGColor], nil]; [self.layer insertSublayer:gradientLayer atIndex:0]; 

Aquí hay dos forms diferentes de solucionar su problema.

  1. Haga gradientLayer una variable de instancia en lugar de una variable local. Luego, layoutSubviews la presentación de vistas en su class de vista para establecer el marco de la capa de gradiente:

     - (void)layoutSubviews { [super layoutSubviews]; _gradientLayer.frame = self.bounds; } 
  2. Cree una subclass de UIView denominada GradientView y +layerClass método +layerClass para devolver [CAGradientLayer class] . Use esta vista para dibujar su degradado en lugar de utilizar una capa directamente. A continuación, establezca la autoresizingMask de autoresizingMask la vista de autoresizingMask (o agregue restricciones si usa la disposition automática). Mira esta respuesta para ver un ejemplo.

La creación de la class GradientView también hará que el cambio de tamaño se comporte correctamente durante la rotation, por lo que recomiendo esa solución.

Cambio el tamaño de los límites de la capa manualmente anulando el método setFrame: de la vista:

 -(void)setFrame:(CGRect)frame { [super setFrame:frame]; _gradientLayer.bounds = CGRectMake(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame)); }