3D анимация открытия дверей между двумя UIViewControllers - PullRequest
4 голосов
/ 07 октября 2011

Об этом уже спрашивали, но в стековом потоке нет примера кода, и, насколько я знаю, нет подходящих решений.У меня есть решение, но выглядит дерьмо.Я был бы благодарен за любой ввод и изменения, чтобы получить более реалистичную 3D-анимацию открытия двери / обложки книги.

Цель состоит в том, чтобы анимация между UIViewControllers была такой, чтобы вы получали эффект, как если бы вы открывали дверьили обложка книги.ViewController 2 статичен и находится в фоновом режиме.Над ним вы помещаете ViewController 1, который охватывает ViewController 2. Анимация откроет ViewController 1 (как книга в твердом переплете) и покажет ViewController 2 (ваша первая страница, так сказать, или что-то еще за дверью).

FirstСледует отметить, что вы не можете сделать это с помощью UINavigationController, поскольку сложно переписать пользовательские анимации.Правильное руководство по настройке двух наших ViewController можно найти здесь: Анимации ViewController

Итак, когда все настроено, вот моя пользовательская анимация, которая выглядит дерьмово.В основном это выглядит так, как будто вы сжимаете дверь / крышку книги слева.Боюсь, нет 3D ощущения.Любые предложения о том, как сделать это лучше, будут приветствоваться:

-(void)openDoorTo:(UIViewController *)aController duration:(float)aDuration {


    [aController viewWillAppear:YES];
    [activeController viewWillDisappear:YES];

    [self.view insertSubview:aController.view belowSubview:activeController.view]; // so that it is below activeController

    [aController viewDidAppear:YES];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:aDuration];

    aController.view.transform = CGAffineTransformMakeTranslation(0,0);

    CATransform3D _3Dt = CATransform3DIdentity;
    _3Dt = CATransform3DTranslate(_3Dt, -320, 0, 0);
    _3Dt = CATransform3DRotate(_3Dt, M_PI * 1.5, 0.0, 1, 0.0);
    _3Dt = CATransform3DTranslate(_3Dt, 320, 0, 0);

    activeController.view.layer.transform = _3Dt;

    [UIView commitAnimations];

    [self performSelector:@selector(animationDone:) withObject:aController afterDelay:aDuration];


}

Я думаю, что главная проблема в том, что я действительно не знаю, как обращаться с CATransform3DTranslate и CATransform3DRotate.

Вот несколько постов на эту тему, но я не могу понять, как применить их к открывателю 3D-дверей:

3D-дверь - но ось посередине

3D разворачивается

1 Ответ

8 голосов
/ 07 октября 2011

Вы должны применить небольшой трюк, чтобы заставить 3D работать:

CATransform3D _3Dt = CATransform3DIdentity;
_3Dt.m34 = 1.0 / -1000;

Это создает перспективное преобразование.1000 представляет расстояние от зрителя до объектов (вы можете поэкспериментировать с этим значением, чтобы получить плавный вид).

...