【问题标题】:How can I draw a rotated UIView with a shadow but without the shadow being rotated as well如何绘制带有阴影但不旋转阴影的旋转 UIView
【发布时间】:2011-08-12 06:49:45
【问题描述】:

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

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;

没有旋转阴影看起来很好:

但在将其旋转 90° 后,阴影也会旋转:

在不覆盖 drawRect 方法并进行低级绘图的情况下,我能做些什么吗?或者也许是某种方法可以用给定的旋转角度校正 shadowOffset?手动校正 90° 的偏移很容易,所以这是没有选择的 ;)

应该是这样的:

提前致谢!

现在有了 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;

这会导致:

而不是

【问题讨论】:

  • 我不知道手动校正偏移量是否适合您。您可以使用 sin/cos 手动计算偏移量,也可以只应用按钮的逆变换
  • @Gobara,手动校正是绝对可以接受的,但它必须是一种可重用的解决方案,而不仅仅是我的代码示例。带有此标头的方法会很酷:- (CGSize)correctedShadowOffsetForRotatedViewWithAngle:(float)anAngle andInitialShadowOffset:(CGSize)anOffset
  • 您是否尝试过使用UIViewconvert... 方法?看起来您必须将 CGSize 放在一个矩形中,因为 UIView 没有直接转换大小的方法。
  • @Richard,我不知道怎么做。如果您有示例,我将不胜感激。
  • 旋转前去掉阴影再应用?

标签: iphone objective-c ios uiview shadow


【解决方案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);
}

【讨论】:

  • 非常感谢!这很好用。我将更新我的答案以显示结果。赏金在 22 小时内到来 :)
【解决方案2】:

我认为你可以尝试使用

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

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

尝试使用它,如果它有效。您需要使用 Trial & Error 方法设置阴影。 如果可以解决您的问题,这只是一个建议或技巧。

【讨论】:

  • 对不起,但正如我在问题中提到的那样:手动更正是没有选择的。但感谢您的努力。
猜你喜欢
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 2021-11-19
  • 2023-04-01
  • 1970-01-01
  • 2012-05-01
相关资源
最近更新 更多