Анимационный между двумя состояниями представления, с помощью пользовательской анимации

Я хотел бы анимировать между двумя состояниями представления. Скажите, например, у меня есть представление с маркировкой и когда я изменяю текст маркировки, анимация представляет то изменение как зеркальное отражение страницы.

Теперь можно, конечно, сделать это с a [UIView setAnimationTransition:forView:cache:]:

- (IBAction)nextPage {
    [UIView beginAnimation:nil context:nil];
    [UIView setAnimationDuration:1];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:pageView cache:NO];
    label.text = @"page 2";
    [UIView commitAnimations];
}

- (IBAction)previousPage {
    [UIView beginAnimation:nil context:nil];
    [UIView setAnimationDuration:1];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:pageView cache:NO];
    label.text = @"page 1";
    [UIView commitAnimations];
}

... но затем Вы не можете использовать свою собственную анимацию, Вы застреваете к встроенным анимациям (они хороши, но они не адаптируются в соответствии с моими потребностями).

Таким образом, другая опция состоит в том, чтобы добавить a CAAnimation к слою представления:

- (IBAction)nextPage {
    CAAnimation *animation = [self animationWithDuration:1 forward:NO];
    [pageView.layer addAnimation:animation forKey:@"pageTransition"];
    label.text = @"page 2";
}

- (IBAction)previousPage {
    CAAnimation *animation = [self animationWithDuration:1 forward:YES];
    [pageView.layer addAnimation:animation forKey:@"pageTransition"];
    label.text = @"page 1";
}

Затем Вы свободны установить независимо от того, что Анимация Ядра анимации позволяет Вам сделать. Это работает хорошо, если я определяю a CATransition анимация, например, a kCATransitionReveal: представление в состоянии "страницы 2" появляется ниже представления в состоянии "страницы 1", как оно выскакивает.

- (CAAnimation *)animationWithDuration:(float)duration forward:(BOOL)forward {
    CATransition *animation = [CATransition animation]; 
    [animation setType:kCATransitionReveal];
    [animation setSubtype:forward?kCATransitionFromLeft:kCATransitionFromRight];
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];

    animation.duration = duration; 
    return animation; 
}

Но когда я определяю анимацию, чтобы быть, например, a CABasicAnimation, только одно состояние представления видимо.

- (CAAnimation *)animationWithDuration:(float)duration forward:(BOOL)forward {
    CATransform3D transform = CATransform3DIdentity;
    transform.m34 = 1.0 / -1000;
    transform = CATransform3DRotate(transform, M_PI, 0.0f, 1.0f, 0.0f);
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
    if(forward) {
        animation.fromValue = [NSValue valueWithCATransform3D:transform];
    } else {
        animation.toValue = [NSValue valueWithCATransform3D:transform];
    }

    animation.duration = duration; 
    return animation; 
}

Вместо этого я хотел бы, чтобы представление в состоянии "страницы 1" осталось видимым до конца анимации, в то время как представление в состоянии "страницы 2" входит в кадр, точно поскольку это ведет себя с анимацией перехода.

Конечно, я мог всегда смешивать с дублированием представления, и наличие того появляются как одноуровневое представление, в то время как я анимирую frontmost один и удаляю его из суперпредставления о завершении..., но должен быть намного более прямой способ достигнуть этого эффекта довольно простой анимации, не смешивая с представлениями.

Вероятно, что-то для сообщения слоя но затем я не знаю то, что, и это - то, где я нуждаюсь помощи, парнях :)

Спасибо!

6
задан KPM 18 June 2014 в 17:39
поделиться

1 ответ

Что ж, вы можете создать слой, установить его содержимое на изображение, представляющее конечное состояние вашего представления, а затем применить анимацию к этому слою. Когда анимация закончена, вы можете удалить слой и переключить состояние просмотра.

Думаю, это сработает лучше, чем создание экземпляра всего вида.

0
ответ дан 17 December 2019 в 22:10
поделиться