Итак, я сейчас тестирую анимации UIView, и я заметил, что тени, визуализируемые CALayer (используя [view.layer setShadowStuffHere]
), исчезают в начале анимации и вновь появляются в конце анимации. Есть ли способ сохранить эти тени и анимировать их вместе с UIView? Я пытался использовать тени без границ, но это была ужасная идея, так как частота кадров упала, как скала во время анимации, и я все равно не получил тени.
Код, который я сейчас использую, находится ниже. Вначале вы видите красный вид, а при нажатии он переходит в более крупный синий вид. Конечный результат должен быть похож на музыкальное приложение для iPad; когда выбран альбом, он переворачивается, показывая вид сзади.
- (void)viewDidLoad {
[super viewDidLoad];
UITapGestureRecognizer * tapRec;
// Drop shadow Path creation
CGFloat x1 = 0;
CGFloat y1 = 0;
CGFloat x2 = 100;
CGFloat y2 = 100;
frontBorderPath = CGPathCreateMutable();
CGPathMoveToPoint(frontBorderPath, NULL, x1, y1);
CGPathAddLineToPoint(frontBorderPath, NULL, x2, y1);
CGPathAddLineToPoint(frontBorderPath, NULL, x2, y2);
CGPathAddLineToPoint(frontBorderPath, NULL, x1, y2);
CGPathAddLineToPoint(frontBorderPath, NULL, x1, y1);
x2 = 400;
y2 = 400;
backBorderPath = CGPathCreateMutable();
CGPathMoveToPoint(backBorderPath, NULL, x1, y1);
CGPathAddLineToPoint(backBorderPath, NULL, x2, y1);
CGPathAddLineToPoint(backBorderPath, NULL, x2, y2);
CGPathAddLineToPoint(backBorderPath, NULL, x1, y2);
CGPathAddLineToPoint(backBorderPath, NULL, x1, y1);
containerView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
containerView.clipsToBounds = NO;
[containerView.layer setShadowPath:frontBorderPath];
[containerView.layer setShadowOpacity:1];
[containerView.layer setShadowOffset:CGSizeMake(0,0)];
[containerView.layer setShadowRadius:3];
[containerView.layer setShouldRasterize:NO];
[self.view addSubview:containerView];
tapRec = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(frontTap)] autorelease];
frontView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
frontView.backgroundColor = [UIColor redColor];
[frontView addGestureRecognizer:tapRec];
[containerView addSubview:frontView];
tapRec = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(backTap)] autorelease];
backView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 400, 400)];
backView.backgroundColor = [UIColor blueColor];
[backView addGestureRecognizer:tapRec];
}
- (void)frontTap{
NSLog(@"fronttap");
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.7];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:containerView cache:YES];
[frontView removeFromSuperview];
[containerView addSubview:backView];
containerView.frame = CGRectMake(100, 100, 400, 400);
[containerView.layer setShadowPath:backBorderPath];
[UIView commitAnimations];
}
- (void)backTap{
NSLog(@"backtap");
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.7];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:containerView cache:YES];
[backView removeFromSuperview];
[containerView addSubview:frontView];
containerView.frame = CGRectMake(100, 100, 100, 100);
[containerView.layer setShadowPath:frontBorderPath];
[UIView commitAnimations];
}