Мне это показалось интересным, поэтому я попробовал. Возможное решение состоит в том, чтобы создать второй четкий вид под основным видом, придав ему (нижнему виду) тень с использованием пути исходного вида. Затем вы можете применить анимацию к обоим представлениям. Я сделал это с простыми прямоугольными представлениями, но не вижу причин, почему это нельзя сделать с более сложными путями или с использованием 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"];
}
Вот так выглядит результат ...
Любые (2D) преобразования должны выглядеть правдоподобно, если вы примените их к обоим видам.
Надеюсь, это поможет!