Мне только что удалось получить что-то.как это работает с использованием CoreAnimation / QuartzCore Framework ... убедитесь, что
#import <QuartzCore/QuartzCore.h>
, когда вы хотите анимировать, используйте CATransform3D и плохо документированное свойство CATransform3D.m34.это сделает первую половину анимации (при условии 200x200 <-> 450x450 с поворотом на 180 °):
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDelegate:self];
CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
rotationAndPerspectiveTransform.m34 = 1.0 / -1000; // this turns on perspective!
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 90.0f * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
someView.layer.transform = rotationAndPerspectiveTransform;
someView.bounds = CGRectMake(0, 0, 325, 325);
[UIView commitAnimations];
для второй половины анимации, вы должны добавить / удалить свое представление в иерархии.в этом примере показано скрытие / отображение представления, которое уже существует как подпредставление someView
, также используется переменная экземпляра BOOL isUp
(первая половина анионирования не зависит от флага isUp!)
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
if (flag) {
if (isUp) {
someSubView.hidden = YES; // hide subview
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
CATransform3D rotationAndPerspectiveTransform = CATransform3DRotate(someView.layer.transform, -90.0f * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
someView.layer.transform = rotationAndPerspectiveTransform;
someView.bounds = CGRectMake(0, 0, 200, 200);
[UIView commitAnimations];
isUp = NO;
} else {
someSubView.hidden = NO; // Show subview
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
CATransform3D rotationAndPerspectiveTransform = CATransform3DRotate(someView.layer.transform, 90.0f * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
someView.layer.transform = rotationAndPerspectiveTransform;
someView.bounds = CGRectMake(0, 0, 450, 450);
[UIView commitAnimations];
isUp = YES;
}
}
}
И последнее: все, что вы видите, будет отображаться зеркально, это может быть не идеальное решение, но зеркальное отражение путем применения CGAffineTransform
к подпредставлению помогает:
- (void)viewDidLoad
{
[super viewDidLoad];
someSubView.transform = CGAffineTransformMakeScale(-1, 1);
isUp = NO;
}
Я уже на месяц опоздал с этим решением, но я надеюсь, что оно кому-то помогло:)
Сначала я попробовал использовать animateWithDuration: animations: завершение: блочный API, но оказалось, что оно сильно запаздываетанимация первой / второй половины даже без трогательных подпредставлений).