Тени CALayer, исчезающие во время анимации UIView

Таким образом, я в настоящее время проверяю анимации 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];

}
6
задан David Liu 4 August 2010 в 02:44
поделиться

1 ответ

Оказалось, что когда вы делаете анимацию UIView, он игнорирует свойство clipsToBounds вашего представления и все равно обрезает его (по крайней мере, для анимации типа переворота), поэтому если вы хотите, чтобы ваши тени всегда были видны, вам нужно иметь достаточно большой фрейм представления, который будет содержать все.

12
ответ дан 9 December 2019 в 20:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: