CALayer shadow en UITableViewCell Dibujado incorrectamente

Estoy aplicando sombra a una UITableViewCell usando CALayer.

Aquí está mi código:

- (void)addShadowToView:(UIView *)view { // shadow view.layer.shadowColor = [[UIColor colorWithWhite:0.0f alpha:0.1f] CGColor]; view.layer.shadowOpacity = 1.0f; view.layer.shadowOffset = CGSizeMake(0.0f, 3.0f); view.layer.shadowRadius = 6.0f; CGRect shadowFrame = view.layer.bounds; CGPathRef shadowPath = [UIBezierPath bezierPathWithRect:shadowFrame].CGPath; view.layer.shadowPath = shadowPath; } 

El problema es que para algunas tableviewcells, la sombra no abarca todo el ancho de la celda. Para algunas celdas sería correcto, para otros sería defectuoso. Me doy count de que la rotation del dispositivo también lo afecta, y la recarga de los datos de la vista de tabla a veces la resuelve.

¿Cuál es la mejor manera de mitigar este problema (y con eso no pretendo volver a cargar toda la vista de tabla en cada rotation, etc.)?

Ejemplo de la parte inferior de la celda donde la sombra se aplica correctamente: introduzca la descripción de la imagen aquí

Parte inferior de la celda en la misma vista de tabla después de desplazarse hacia abajo (la sombra solo se aplica al primer 75% de ancho): introduzca la descripción de la imagen aquí

Edit: He notado que el problema se debe a estas líneas de código:

 CGRect shadowFrame = view.layer.bounds; CGPathRef shadowPath = [UIBezierPath bezierPathWithRect:shadowFrame].CGPath; view.layer.shadowPath = shadowPath; 

Si los dejo, todo está bien. Pero me han dicho que hay cierto beneficio de performance al usar esto. De alguna forma, la sombra no se aplica correctamente a las nuevas dimensiones después de rotar ..

Puede anular el setter para su marco de celda y llamar a addShadowToView: Puede optimizar esto más almacenando el tamaño de su celda y solo actualizando la ruta de acceso oculto cuando el tamaño cambia, por ejemplo:

 @property (nonatomic, assign) CGSize size; 

Y

 - (void) setFrame:(CGRect)frame { [super setFrame:frame]; // Need to check make sure this subview has been initialized if(self.subviewThatNeedsShadow != nil && !CGSizeEqualToSize(self.size,_frame.size) { [self addShadowToView: self.subviewThatNeedsShadow]; } } 

La solución más fácil es agregar la sombra a la ContentView de UITableViewCell (frente a la capa para la vista de respaldo de la celda). Dado que los límites de la celda cambian en el desplazamiento, si agrega la sombra a la vista raíz, debería actualizar la ruta de la sombra en cada desplazamiento, lo que sería costoso y no necesario.

Definitivamente estás correcto: el golpe de performance al no configurar explícitamente shadowPath. Si no tiene contenido animado dentro de la celda, también recomendaría rasterizarlo para mejorar aún más el performance.

EDITAR: también debe asegurarse de que cuando configure la ruta de sombra que los límites de contentView estén en su position 'final'. Si el tamaño de la celda se modifica más tarde, esto resultará en el cambio de los límites del contenido y, por lo tanto, en un shadowPath incorrecto. La solución a esto es actualizar la ruta en UITableViewCell's – método layoutSubviews .