tutomarte sombreados sombreado divierte dibujos dibujar dibuja cómo clases arte animales iphone objective-c ios uiview shadow

iphone - sombreados - ¿Cómo puedo dibujar una UIView girada con una sombra pero sin que la sombra se gire también?



dibujos sombreados (2)

Me gustaría que la sombra se aplicara correctamente después de la rotación. 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 rotación, la sombra se ve bien:

Pero después de rodarlo 90 °, la sombra también gira:

¿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 corrige el shadowOffset con un ángulo de rotación dado? Es fácil corregir el desplazamiento a mano durante 90 °, por lo que no es una opción;)

Debe tener un aspecto como este:

¡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:

en lugar de


Creo que podrías intentar usar

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

a

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

Intenta usar esto, si funciona. O bien, debes configurar la sombra con el método de prueba y error. Esto es solo una sugerencia o un truco si pudieras resolver tu problema.


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); }