Я хотел бы анимировать между двумя состояниями представления. Скажите, например, у меня есть представление с маркировкой и когда я изменяю текст маркировки, анимация представляет то изменение как зеркальное отражение страницы.
Теперь можно, конечно, сделать это с 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 один и удаляю его из суперпредставления о завершении..., но должен быть намного более прямой способ достигнуть этого эффекта довольно простой анимации, не смешивая с представлениями.
Вероятно, что-то для сообщения слоя но затем я не знаю то, что, и это - то, где я нуждаюсь помощи, парнях :)
Спасибо!
Что ж, вы можете создать слой, установить его содержимое на изображение, представляющее конечное состояние вашего представления, а затем применить анимацию к этому слою. Когда анимация закончена, вы можете удалить слой и переключить состояние просмотра.
Думаю, это сработает лучше, чем создание экземпляра всего вида.