Как я могу нарисовать повернутый UIView с тенью, но без поворота тени
Я хочу, чтобы тень применилась правильно после вращения. Это мой код:
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]()
Ответы
Ответ 1
Предполагая, что 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);
}
Ответ 2
Я думаю, вы могли бы попробовать использовать
myButton.layer.shadowOffset = CGSizeMake(-12.0, -12.0);
до
myButton.layer.shadowOffset = CGSizeMake(12.0, 12.0);
Просто попробуйте использовать это, если оно работает. Вам нужно установить тень с помощью метода Trial и Error.
Это всего лишь предложение или трюк, если вы можете решить вашу проблему.