Как динамически регулировать тень во время вращения UIImageView? - PullRequest
8 голосов
/ 11 августа 2011

Я использую следующее для кода, чтобы добавить тень:

letterE.layer.shadowColor = [[UIColor blackColor] CGColor];
letterE.layer.shadowOffset = CGSizeMake(2.5, 2.5);
letterE.layer.shadowRadius = 3.0;
letterE.layer.shadowOpacity = 0.95;

и следующие для поворота:

CABasicAnimation* rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0];
rotationAnimation.duration = 5.0;
rotationAnimation.cumulative = YES;
rotationAnimation.repeatCount = 1.0; 
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

[letterE.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];

Во время анимации тень статична и выглядит странно:

enter image description here enter image description here

Как сделать так, чтобы тень динамически обновлялась во время анимации?

1 Ответ

13 голосов
/ 11 августа 2011

Мне это показалось интересным, поэтому я попробовал. Возможное решение состоит в том, чтобы создать второй четкий вид под основным видом, придав ему (нижнему виду) тень с использованием пути исходного вида. Затем вы можете применить анимацию к обоим представлениям. Я сделал это с простыми прямоугольными представлениями, но не вижу причин, почему это нельзя сделать с более сложными путями или с использованием 2 CALayers вместо 2 UIViews.

Вот так я настраиваю свои взгляды ...

testView = [[UIView alloc] initWithFrame:CGRectMake(40, 40, 100, 100)];
testView.backgroundColor = [UIColor redColor];

//increase y origin of second view to simulate shadow offset
testViewShadow = [[UIView alloc] initWithFrame:CGRectMake(40, 50, 100, 100)];

CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(0, 0, testView.frame.size.width, testView.frame.size.height)); 
testViewShadow.layer.shadowPath = path;
testViewShadow.layer.shadowOpacity = 1.0;
testViewShadow.layer.shadowOffset = CGSizeMake(0, 0);
testViewShadow.layer.shadowRadius = 10.0;
CFRelease(path);

[self.view addSubview:testViewShadow];
[self.view addSubview:testView];

.. и моя анимация (просто подключили CAAnimation к кнопке как IBAction и применили к обоим представлениям) ...

- (IBAction)rotate:(id)sender{
    CABasicAnimation* rotationAnimation;
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0];
    rotationAnimation.duration = 5.0;
    rotationAnimation.cumulative = YES;
    rotationAnimation.repeatCount = 1.0; 
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

    [testView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
    [testViewShadow.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}

Вот так выглядит результат ...

enter image description here enter image description here

Любые (2D) преобразования должны выглядеть правдоподобно, если вы примените их к обоим видам.

Надеюсь, это поможет!

...