Как реализовать переход UIView - PullRequest
0 голосов
/ 25 апреля 2011

У меня есть приложение, в котором есть стартовый экран с кнопкой запуска. Если вы нажмете на эту кнопку, вид изменится, и появится новый вид, давайте назовем этот основной вид.

То, как я это реализовал, - это один контроллер представления на представление. Теперь, когда я хочу добавить анимацию перехода, эта реализация вызывает проблемы. Например, я хочу использовать следующий код:

[UIView transitionFromView:startView toView: mainView duration: 2.0 
 options: UIViewAnimationOptionTransitionCurlDown completion: NULL];

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

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

Теперь, как правильно осуществить переход вида, когда контроллер вида тоже меняется? Большое спасибо за вашу помощь!

Редактировать: Я ищу решение, в котором уничтожен первый контроллер вида.

Ответы [ 3 ]

2 голосов
/ 07 июля 2012

Было предложено эффективно создать контроллер представления, использовать его представление, но затем игнорировать сам контроллер.Это не рекомендуется.В iOS вы хотите, чтобы ваша иерархия контроллера представления синхронизировалась с вашей иерархией представления.Поэтому любые методы, подобные предложенному, являются проблематичными.( Сессия WWDC 2011 102 , хотя и на другую тему, посвященную контроллеру представления, долго обсуждает важность синхронизации этих двух иерархий.)

Наиболее очевидная проблема заключается в том, что некоторыесобытия, особенно события поворота, не будут успешно переданы вашему новому контроллеру, и вы можете получить очень странные результаты.Также с вашим кодом выше неясно, что происходит с удаленным старым представлением, как вы вернетесь назад, как вычистите ненужный игровой контроллер, что произошло бы на didReceiveMemoryWarning, если бы вы были в игровом контроллере.и т. д. Это, кажется, создает массу проблем.

Самое простое решение - применить стандартные вызовы pushViewController и / или presentViewController для перехода от одного представления к другому и просто анимировать эти переходы.Если у вас есть вопросы об этих методах или о том, как их анимировать в контексте этих методов, сообщите мне.

2 голосов
/ 07 июля 2012

Кстати, корень вашего вопроса был в том, как перейти между контроллерами представления.Вот старая коллекция переходов (некоторые для push-переходов, некоторые для модальных переходов), с которыми я когда-то играл.Может быть, здесь есть что-то, что вы могли бы использовать?

- (void)transitionToNewController
{
    MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyView" bundle:nil];

#if TRANSITIONTYPE == 1

    // pushViewController with push/slide from right via CATransition

    CATransition* transition = [CATransition animation];

    transition.duration = 0.3;
    transition.type = kCATransitionPush;
    transition.subtype = kCATransitionFromRight;

    [self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
    [self.navigationController pushViewController:controller animated:NO];
#endif

#if TRANSITIONTYPE == 2

    // pushViewController with flip using UIView begin/commitAnimations

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:0.75];
    [self.navigationController pushViewController:controller animated:NO];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.navigationController.view cache:NO];
    [UIView commitAnimations];
#endif

#if TRANSITIONTYPE == 3

    // pushViewController with flip using animation block

    [UIView animateWithDuration:0.5 
                     animations:^{
                         [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
                         [self.navigationController pushViewController:controller animated:NO];
                         [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.navigationController.view cache:NO];
                     }
                     completion:nil];

#endif

#if TRANSITIONTYPE == 4

    // pushViewController with fade via CATransition

    CATransition* transition = [CATransition animation];

    transition.duration = 0.5;
    transition.type = kCATransitionFade;

    [self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
    [self.navigationController pushViewController:controller animated:NO];
#endif

#if TRANSITIONTYPE == 5

    // pushViewController with fade via animation block

    controller.view.alpha = 0.0f;

    [UIView animateWithDuration:0.5 
                     animations:^{
                         self.view.alpha = 0.0f;
                         controller.view.alpha = 1.0f;
                     }
                     completion:^(BOOL finished){
                         [self.navigationController pushViewController:controller animated:NO];
                         self.view.alpha = 1.0f; // reset the src alpha so it's there when you pop your view controller off
                     }];
#endif

#if TRANSITIONTYPE == 6

    // pushViewController Flip using UIView begin/commitAnimations

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:0.75];
    [self.navigationController pushViewController:controller animated:NO];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:[self.self navigationController].view cache:NO];
    [UIView commitAnimations];
#endif

#if TRANSITIONTYPE == 7

    // pushViewController animation using CGAffine scale to look like we're zooming into the new view

    [self.view addSubview:controller.view];
    [controller.view setFrame:self.view.window.frame];
    [controller.view setTransform:CGAffineTransformMakeScale(0.5,0.5)];
    [controller.view setAlpha:1.0];

    [UIView animateWithDuration:0.5
                          delay:0.0
                        options:UIViewAnimationCurveEaseOut 
                     animations:^{
                         [controller.view setTransform:CGAffineTransformMakeScale(1.0,1.0)];
                         [controller.view setAlpha:1.0];
                     } 
                     completion:^(BOOL finished){
                         [controller.view removeFromSuperview];
                         [self.navigationController pushViewController:controller animated:NO];
                     }];
#endif

#if TRANSITIONTYPE == 8

    // presentViewController animation with slide from right by using CGAffineTransform

    self.view.transform = CGAffineTransformMakeTranslation(0, 0);
    controller.view.transform = CGAffineTransformMakeTranslation(self.view.frame.size.width, 0);
    [self.view addSubview:controller.view];

    [UIView animateWithDuration:4.0
                     animations:^{
                         //                         [self presentViewController:controller animated:NO completion:nil];
                         self.view.transform = CGAffineTransformMakeTranslation(self.view.frame.size.width, 0);
                         controller.view.transform = CGAffineTransformMakeTranslation(0, 0);
                     }
                     completion:^(BOOL finished){
                         [controller.view removeFromSuperview];
                         [self presentViewController:controller animated:NO completion:nil];
                     }
     ];
#endif

#if TRANSITIONTYPE == 9

    // presentViewController animation with slide from right by just animating frames

    float width = self.navigationController.view.frame.size.width;

    CGPoint right = controller.view.center;
    right.x += width;
    controller.view.center = right;

    [self.navigationController.view addSubview:controller.view];

    [UIView animateWithDuration:0.5
                     animations:^{
                         CGPoint left = self.navigationController.view.center;
                         left.x -= width;
                         self.navigationController.view.center = left;
                     }
                     completion:^(BOOL finished){
                         [controller.view removeFromSuperview];
                         [self presentViewController:controller animated:NO completion:nil];
                     }
     ];
#endif

#if TRANSITIONTYPE == 10

    // presentViewController animation with flipfromright

    [UIView animateWithDuration:4.0
                          delay:0.0 
                        options:UIViewAnimationOptionTransitionFlipFromRight 
                     animations:^{
                         [self.view addSubview:controller.view];
                     }
                     completion:^(BOOL finished){
                         [controller.view removeFromSuperview];
                         [self presentViewController:controller animated:NO completion:nil];
                     }];
#endif

#if TRANSITIONTYPE == 11

    // presentViewController with flip using UIView begin/commitAnimations

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:0.75];
    [self presentViewController:controller animated:NO completion:nil];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:NO];
    [UIView commitAnimations];
#endif

#if TRANSITIONTYPE == 13

    // pushViewController with flip using animation block with transitionWithView

    controller.view.frame = self.view.window.frame;

    [UIView transitionWithView:self.view.superview 
                      duration:1.0
                       options:UIViewAnimationTransitionFlipFromRight
                    animations:^{
                        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
                        [self.view.superview addSubview:controller.view];
                        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.navigationController.view cache:NO];
                    }
                    completion:^(BOOL finished){
                        [self.navigationController pushViewController:controller
                                                             animated:NO];
                    }];

#endif

}
1 голос
/ 25 апреля 2011

Ладно, я нашел отличный способ добиться именно того, чего хочу.Этот код, добавленный в метод, где я обмениваю старый контроллер вида и смотрю на новый, прекрасно работает:

GameViewController *game = [[GameViewController alloc] init];
UIView *currentView = [currentViewController view];
// remove the current view and replace with myView1
[currentView removeFromSuperview];
// set up an animation for the transition between the views
CATransition *animation = [CATransition animation];
[animation setDuration:0.5];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromBottom];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
[[window layer] addAnimation:animation forKey:@"SwitchToView1"];    
[self setCurrentViewController: game];
[window addSubview:[currentViewController view]];
[game release];

Большое спасибо ЗДЕСЬ !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...