¿Cómo puedo dibujar una UIView girada con una sombra pero sin girar también la sombra?

Me gustaría que la sombra se aplicara correctamente después de la rotation. Este es mi código:

myButton.transform = CGAffineTransformMakeRotation(M_PI / 180.0 * 90.0); myButton.layer.shadowOffset = CGSizeMake(12.0, 12.0); myButton.layer.shadowRadius = 2.0; myButton.layer.shadowOpacity = 0.8; myButton.layer.shadowColor = [UIColor blackColor].CGColor; 

Sin rotation, la sombra se ve bien:

introduzca la descripción de la imagen aquí

Pero luego de rorarlo 90 °, la sombra también gira:

introduzca la descripción de la imagen aquí

¿Hay algo que pueda hacer al respecto sin anular el método drawRect y hacer un dibujo de bajo nivel? ¿O tal vez algún método que corrija el ShadowOffset con un determinado ángulo de rotation? Es fácil corregir el desplazamiento manualmente a 90 °, por lo que no es una opción;)

Debe tener un aspecto como este:

introduzca la descripción de la imagen aquí

¡Gracias por adelantado!

¡Con la ayuda de Bartosz Ciechanowski esto funciona ahora!

 float angleInRadians = M_PI / 180.0 * -35.0; myButton.transform = CGAffineTransformMakeRotation(angleInRadians); myButton.layer.shadowOffset = [self correctedShadowOffsetForRotatedViewWithAngle:(angleInRadians) andInitialShadowOffset:CGSizeMake(12.0, 12.0)]; myButton.layer.shadowRadius = 2.0; myButton.layer.shadowOpacity = 0.8; myButton.layer.shadowColor = [UIColor blackColor].CGColor; 

Esto resulta en:

introduzca la descripción de la imagen aquí

en lugar de

introduzca la descripción de la imagen aquí

Suponiendo que anAngle esté en radianes:

 - (CGSize)correctedShadowOffsetForRotatedViewWithAngle:(CGFloat)anAngle andInitialShadowOffset:(CGSize)anOffset { CGFloat x = anOffset.height*sinf(anAngle) + anOffset.width*cosf(anAngle); CGFloat y = anOffset.height*cosf(anAngle) - anOffset.width*sinf(anAngle); return CGSizeMake(x, y); } 

Creo que podrías intentar usar

 myButton.layer.shadowOffset = CGSizeMake(-12.0, -12.0); 

a

 myButton.layer.shadowOffset = CGSizeMake(12.0, 12.0); 

Intente usar esto, si funciona. O bien, debe configurar la sombra con el método de testing y error. Esto es solo una sugerencia o un truco si pudiera resolver su problema.