iOS: анимация между контроллерами представления

Я не могу найти это нигде. Так что, если у вас есть информация об этом, пожалуйста, дайте мне ссылку.

У меня один контроллер просмотра, я сделал меню для простой игры. На нем есть какие-то кнопки. У меня есть еще один контроллер представления и там тоже несколько кнопок.

Возникает вопрос: «Как я могу сделать анимацию этих кнопок (скрываясь за экраном) после того, как я выберу одну кнопку, которая запускает настраиваемый переход (без какой-либо анимации) к другому контроллеру представления, который будет запускать анимацию кнопки (приходя к экран от границы экрана)?"

Я сделал это так:

1) Теория: я делаю IBAction для кнопки меню, затем в этом IBAction я вызываю метод анимации, который вызывает метод executeSegueMethod:. После этого в новом ВК в методе viewWillAppear вызовите метод анимации (тот самый метод, что и в исходном ВК). Все это работает, но это не выглядит гладко. Проблема с этой анимацией возникает, когда конечный виртуальный канал заменяет исходный виртуальный канал. Есть какая-то доля секунды, когда все выглядит статично, и только после этого начинается анимация. Я не знаю, как убрать задержку VC для этого пункта назначения. Может быть, я должен загрузить представление назначения перед переходом? Я пытался это сделать, но может быть что-то сделал не так, или это просто мне не помогает.

2) Практика:

первыйViewController.m:

- (IBAction)newGameSegueButton {

[self menuSlideInDirection:@"CenterToLeft" performingSegueWithIdentifier:@"mode"];

}


-(void)menuSlideInDirection:(NSString *)direction performingSegueWithIdentifier:(NSString *)segueIdentifier
{


[UIView animateWithDuration:0.4 animations:^{

    CGPoint newGameButtonCenter;
    newGameButtonCenter.x = directionIndex * 160;
    newGameButtonCenter.y = self.gameButtonSlide.center.y;
    self.gameButtonSlide.center = newGameButtonCenter;

    [UIView animateWithDuration:0.3 delay:0.1 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
       //some animation too

    } completion:nil];


    [UIView animateWithDuration:0.2 delay:0.2 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
        //animation 

    } completion:nil];


    [UIView animateWithDuration:0.1 delay:0.3 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
       //some animation too

    } completion:^(BOOL finished){

        if(segueIdentifier){
            [self performSegueWithIdentifier:segueIdentifier sender:self];

        }
    }];





}];


}

Хорошо, тогда пользовательский код перехода довольно прост:

-(void)perform
{


UIViewController *src = self.sourceViewController;
UIViewController *dst = self.destinationViewController;

[src.navigationController pushViewController:dst animated:NO];


}

И мой второйViewController.m:

-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];


[self menuSlideInDirection:@"RightToCenter" performingSegueWithIdentifier:nil];

}

menuSlideInDirection:@"RightToCenter", выполняющий SegueWithIdentifier:nil во secondViewController, идентичен методу с тем же именем в firstView.

Я ищу плавную анимацию определенных объектов контроллера представления назначения сразу после перехода.

Может быть, все делается неправильно, и есть другой способ сделать это? (Я думаю только о том, чтобы добавить все виды и все элементы управления целевого VC в исходный VC и вообще удалить «целевой VC»).

Надеюсь, кто-нибудь может помочь мне с этим.


person Dima Deplov    schedule 04.07.2013    source источник
comment
Какой переход вы делаете к новому контроллеру представления?   -  person Matt Mc    schedule 05.07.2013
comment
Хм, я думаю, что не использую никаких переходов, как вы можете видеть в моем методе выполнения. Я правильно понял тебя?   -  person Dima Deplov    schedule 05.07.2013
comment
Вы звоните performSegueWithIdentifier:. Это пуш, модал? Что это за сиг? Опять же, это, вероятно, не имеет значения; Мне просто было любопытно. Вы правы в том, что помещение обоих представлений в один и тот же VC поставит весь процесс под ваш контроль и позволит вам убедиться, что он проходит гладко. В противном случае вы можете сделать хак, который предложил Рошан.   -  person Matt Mc    schedule 05.07.2013
comment
@MattMc Я использую пользовательский переход, хм, я не знаю, честно говоря, push или модальный режим. Я публикую метод выполнения пользовательского класса segue. Я думаю, на самом деле это пуш segue.   -  person Dima Deplov    schedule 05.07.2013


Ответы (2)


Попробуйте выполнить всю анимацию контроллера первого представления в методе perform.

Что касается анимации второго контроллера представления, я не думаю, что есть какой-либо другой «хороший» способ, кроме как сделать это в viewWillAppear (хотя я бы предпочел viewDidAppear), поскольку выходы целевого контроллера представления не устанавливаются во время выполнения перехода (они будет ноль). Другими словами, у вас нет доступа к кнопкам, не говоря уже об их анимации.

Хакерским способом было бы вызвать [segue.destinationViewController view] перед perform, чтобы загрузить иерархию представлений целевого контроллера представления и установить выходы. Затем, возможно, вы можете анимировать кнопки в целевом контроллере представления в perform, прежде чем помещать его в стек навигации.

person Roshan    schedule 05.07.2013
comment
Как я могу сделать всю первую анимацию VC в методе perform, если у меня нет выходов для этих кнопок в пользовательском классе перехода? - person Dima Deplov; 05.07.2013
comment
тот же вопрос для хакерского пути и точек назначения VC - person Dima Deplov; 05.07.2013
comment
Я прав, [segue.destinationViewController view] я должен добавить, чтобы подготовиться к переходу? - person Dima Deplov; 05.07.2013
comment
Забудь сказать, все это не работает, как я хочу :( Никаких заметных изменений, после этого изменения в коде. - person Dima Deplov; 06.07.2013

Для моего вопроса я выбираю способ размещения двух представлений под одним и тем же ВК. Анимация плавная и выглядит намного лучше, чем при использовании метода Perform/viewWillAppear.

person Dima Deplov    schedule 15.07.2013