transitionFromView: toView: длительность: параметры: завершение: не анимация перехода - PullRequest
7 голосов
/ 29 октября 2011

У меня есть контроллер представления, который отображает представления 2 контроллеров вспомогательного представления в заданной области его представления. 2 подчиненных контроллера - это FlopVC и FipVC.

Я хочу анимировать переход от одного вспомогательного представления к другому. Код, который я использую:

-(IBAction)flip:(id)sender{

    UIViewController *newVC = nil;

    if (self.isFlip) {
        newVC = [[FlopVC alloc] initWithNibName:nil bundle:nil];
    }else{
        newVC = [[FipVC alloc] initWithNibName:nil bundle:nil];
    }

    newVC.view.frame = CGRectMake(120, 20, 240, 260);
    [self.view addSubview:newVC.view];

    [UIView transitionFromView:self.currentVC.view
                        toView:newVC.view
                      duration:0.9
                       options:UIViewAnimationTransitionFlipFromLeft 
                    completion:^(BOOL finished) {
                        self.currentVC = newVC;
                        self.isFlip = ! self.isFlip;
                    }];



}

Подвиды меняются местами, но без анимации. Что я делаю не так?

PS полный проект здесь .

Ответы [ 3 ]

19 голосов
/ 29 октября 2011
UIView<b>Animation</b>TransitionFlipFromLeft != UIView<b>AnimationOption</b>TransitionFlipFromLeft
3 голосов
/ 29 октября 2011

если вы используете новую парадигму контейнера представления iOS5, вам нужно сделать что-то вроде следующего:

-(IBAction)flip:(id)sender{

    UIViewController *newVC = nil;

    if (self.isFlip) {
       newVC = [[FlopVC alloc] initWithNibName:nil bundle:nil];
    }else{
       newVC = [[FipVC alloc] initWithNibName:nil bundle:nil];
    }

    newVC.view.frame = CGRectMake(120, 20, 240, 260);

    // required for the new viewController container
    self.currentVC willMoveToParentViewController:nil];
    [self addChildViewController:newVC];
    [self transitionFromViewController:self.currentVC
                  toViewViewController:newVC.view
                              duration:0.9
                               options: UIViewAnimationOptionTransitionFlipFromLeft 
                            animations:nil
                            completion:^(BOOL finished) {
                               // required for the new viewController container
                               [self.currentVC removeFromParentViewController];
                               [newVC didMoveToParentViewController:self];

                               self.currentVC=newVC;
                             }];



}

см. Раздел Реализация контроллера представления контейнера иВидео WWDC 2011 года о контейнерах UIViewController для получения дополнительной информации.

2 голосов
/ 05 ноября 2011

Вот рабочий код, который (по стечению обстоятельств) делает именно то, что вы описываете. Мои два дочерних VC хранятся в self->swappers. Целое число cur отслеживает, какой из них отображается в данный момент. Место в моем интерфейсе, куда должен перейти подпредставление, помечено точкой просмотра, panel.

UIViewController* fromvc = [self->swappers objectAtIndex:cur];
cur = (cur == 0) ? 1 : 0;
UIViewController* tovc = [self->swappers objectAtIndex:cur];
tovc.view.frame = self.panel.bounds;

// must have both as children before we can transition between them
[self addChildViewController:tovc]; // "will" called for us
// note: when we call remove, we must call "will" (with nil) beforehand
[fromvc willMoveToParentViewController:nil];

[self transitionFromViewController:fromvc
                  toViewController:tovc
                          duration:0.4
                           options:UIViewAnimationOptionTransitionFlipFromLeft
                        animations:nil
                        completion:^(BOOL done){
                            // note: when we call add, we must call "did" afterwards
                            [tovc didMoveToParentViewController:self];
                            [fromvc removeFromParentViewController]; // "did" called for us
                        }];
...