如何绘制带有阴影但没有阴影旋转的旋转UIView

时间:2011-04-25 11:32:56

标签: iphone objective-c ios uiview shadow

旋转后我想正确应用阴影。这是我的代码:

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

提前致谢!

在Bartosz Ciechanowski的帮助下,现在可以使用了!

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 个答案:

答案 0 :(得分:27)

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

答案 1 :(得分:0)

我认为您可以尝试使用

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

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

尝试使用它,如果它有效。要么你需要设置试验& amp;错误方法。 如果可以解决您的问题,这只是一个建议或技巧。