Как нарисовать повернутый UIView с тенью, но без поворота тени? - PullRequest
13 голосов
/ 25 апреля 2011

Я бы хотел, чтобы тень правильно наносилась после поворота.Это мой код:

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;

Без вращения тень выглядит хорошо:

enter image description here

Но после поворота на 90 ° тень также поворачивается:

enter image description here

Могу ли я что-нибудь сделать с этим без переопределения метода drawRect и рисования низкого уровня?Или, может быть, какой-то метод, который исправляет shadowOffset с заданным углом поворота?Поправка на 90 ° легко исправить вручную, поэтому это не вариант;)

Это должно выглядеть так:

enter image description here

Заранее спасибо!

С помощью Бартоша Цехановского это работает сейчас!

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;

В результате:

enter image description here

вместо

enter image description here

Ответы [ 2 ]

27 голосов
/ 27 апреля 2011

Предположим, anAngle в радианах:

- (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);
}
0 голосов
/ 27 апреля 2011

Я думаю, вы можете попробовать использовать

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

до

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

Просто попробуйте использовать это, если это работает. Либо вам нужно установить теньс методом проб и ошибок.Это всего лишь предложение или хитрость, если вы можете решить вашу проблему.

...