Reproducción automática y sombra

Tengo un problema al agregar sombra a mi UIView, que se crea en la aplicación iOS 6 con Autolayout.

Supongamos que tengo un método que agrega una sombra en la parte inferior de UIView (esto es realmente una categoría de UIView, por lo que es reutilizable):

- (void) addShadowOnBottom { self.layer.shadowOffset = CGSizeMake(0, 2); self.layer.shadowOpacity = 0.7; self.layer.shadowColor = [[UIColor blackColor] CGColor]; self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.bounds].CGPath; } 

Cuando viewDidLoad este método en viewDidLoad de algún UIViewController, la sombra no se agrega, probablemente debido a todas las restricciones, que deben calcularse.

Cuando viewWillAppear este método en vista, viewWillAppear la misma situación.

Cuando llamo a este método en viewDidAppear funciona, pero cuando aparece una nueva vista hay un breve momento en el que no hay sombra y aparece después de un rato.

Si renuncio a configurar shadowPath y eliminar la línea self.layer.shadowPath todo funciona, pero las transiciones de vista no son suaves.

Entonces, mi pregunta es ¿cuál es la forma correcta de agregar una sombra para ver en iOS 6 con Autolayout activado?

Otra cosa que puede agregar a la capa cuando trabaja con AutoLayout y necesita una sombra en una UIView donde aún no se conoce el cuadro es la siguiente:

 self.layer.rasterizationScale = [[UIScreen mainScreen] scale]; // to define retina or not self.layer.shouldRasterize = YES; 

Luego elimine la propiedad shadowPath porque las restricciones de layout automático aún no se han procesado, por lo que es irrelevante. También en el momento de la ejecución no conocerás los límites o el marco de la vista.

¡Esto mejora el performance mucho!

Tener exactamente el mismo problema …

Aunque no consigo que la sombra de CALayer se vea animada, al less la sombra se vuelve a alinear correctamente después de la animation.

Mi solución (que funciona bien en mi aplicación) es establecer shadowOpacity en 0, luego restablecerla al valor deseado DESPUÉS de que la animation se haya completado. Desde la perspectiva de un usuario, ni siquiera puede decir que la sombra se ha ido porque las animaciones suelen ser demasiado rápidas para percibir la diferencia.

Aquí hay un ejemplo de algún código en mi aplicación, en el que estoy cambiando el valor constante de una restricción, que es 'borde de salida para supervise' NSLayoutContraint:

 - (void) expandRightEdge { [self.mainNavRightEdge setConstant:newEdgeConstant]; [self updateCenterContainerShadow]; [UIView animateWithDuration:ANIMATION_DURATION delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ [[NSNotificationCenter defaultCenter] postNotificationName:@"PanelLayoutChanged" object:nil]; [self.view layoutIfNeeded]; } completion:^(BOOL finished) { nil; }]; } - (void) updateCenterContainerShadow { self.centerContainer.layer.masksToBounds = NO; self.centerContainer.layer.shadowOpacity = 0.8f; self.centerContainer.layer.shadowRadius = 5.0f; self.centerContainer.layer.shadowOffset = CGSizeMake(0, 0); self.centerContainer.layer.shadowColor = [UIColor blackColor].CGColor; CGPathRef shadowPath = [UIBezierPath bezierPathWithRect:self.centerContainer.layer.bounds].CGPath; [self.centerContainer.layer setShadowPath:shadowPath]; // Schedule a time to fade the shadow back in until we can figure out the CALayer + Auto-Layout issue [self performSelector:@selector(fadeInShadow) withObject:nil afterDelay:ANIMATION_DURATION+.05]; } - (void) fadeInShadow { [self.centerContainer.layer setShadowOpacity:0.8f]; } 

Dos cosas:

  • Podría haber puesto el fadeInShadow en el bloque de finalización, pero debido a la forma en que se incluye un poco de mi otro código, esto funciona mejor para mí.
  • Me doy count de que no estoy ejecutando un fundido con "fadeInShadow", pero dado lo rápido que se muestra después de completar la animation, descubrí que no es necesario.

¡Espero que ayude!

self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.bounds].CGPath; desde su código y está funcionando para mí en viewDidLoad , confirme.

El aumento de la function shdowOffset hará que vea la sombra más clara.