Falsificando um Segue Push (Objective-C)

Recentemente, fui abordado com um desafio legal. Eu precisava encontrar uma maneira de “simular” uma animação push, para frente e para trás. Normalmente você usa as transições fornecidas (gratuitamente) com Modal ou Push segue, mas isso precisava ser uma animação push sem NavigationBar e nenhuma NavigationBar oculta, basicamente isso é impossível de fazer sem uma NavigationBar a menos que você use um Segue personalizado que eu achei muito fácil para implementar e abrir a porta para muitas transições novas e interessantes que podem tornar seu aplicativo único!

Vamos criar um segmento push “falso”:

Faremos algo muito simples, mas que mostra como criar um segue personalizado. Acho que fazer algo realmente simples torna o aprendizado muito melhor.

  1. Crie um novo projeto. Modelo de visualização única.
  2. Adicionar uma nova classe (Arquivo -> Novo -> Arquivo: Cocoa Touch: Classe Objective-C):

Classe: MyCustomSeguePushForward
Subclasse de: UIStoryboardSegue

Como precisamos de uma animação personalizada para “Voltar”, repita a etapa 2, mas com esta nova informação:

Classe: MyCustomSeguePushBackward
Subclasse de: UIStoryboardSegue

  1. Vá para o Storyboard e adicione mais um ViewController (você deve ter 2 ViewControllers) no storyboard. Arraste um UIButton para um dos Storyboard e desse UIButton crie um Segue para o segundo ViewController. (Clique com o botão direito do botão para o segundo storyboard e solte, ou Control + Clique). Quando você cria um segmento em seu storyboard, você tem 3 opções: Modal, Push ou Custom. Crie um segmento personalizado. Em seguida, você precisa selecionar o Segue e sob o tipo de “Classe do Segue” ou nome da classe personalizada: MyCustomSeguePushForward.

  2. No segundo ViewController (destino), você precisa repetir os passos para que possamos voltar ao ViewController original: Crie um botão, depois crie um Segue Customizado, mas desta vez use o nome da classe: MyCustomSeguePushBackward

CenárioCenário

  1. Agora iremos substituir o método “executar” para alcançar o que queremos. Abra MyCustomSeguePushForward.m e crie um método chamado perform com o seguinte código:

– (vazio) executar {

UIView *preV = ((UIViewController *)self.sourceViewController).view;
UIView *newV = ((UIViewController *)self.destinationViewController).view;

UIWindow *window = [[[UIApplication sharedApplication] delegate] window];
newV
.center = CGPointMake(preV.center.x + preV.frame.size.width, newV.center.y);
[window insertSubview:newV aboveSubview:preV];

[UIView animateWithDuration:0.4
animations
:^{
newV
.center = CGPointMake(preV.center.x, newV.center.y);
preV
.center = CGPointMake(0- preV.center.x, newV.center.y);}
completion
:^(BOOL finished){
[preV removeFromSuperview];
window
.rootViewController = self.destinationViewController;
}];

}

  1. Já que o método para voltar é quase o mesmo, pedi ajuda ao meu amigo Vivek Vasani, pois meu cérebro não estava funcionando 100%. Juntos, conseguimos reverter o código e fazer a animação “Push Back”. Abra MyCustomSeguePushBackward.m e escreva o seguinte método:

– (vazio) executar {

UIView *preV = ((UIViewController *)self.sourceViewController).view;
UIView *newV = ((UIViewController *)self.destinationViewController).view;

UIWindow *window = [[[UIApplication sharedApplication] delegate] window];
newV
.center = CGPointMake(preV.center.x - preV.frame.size.width, newV.center.y);
[window insertSubview:newV aboveSubview:preV];

[UIView animateWithDuration:0.4
animations
:^{
newV
.center = CGPointMake(preV.center.x, newV.center.y);
preV
.center = CGPointMake(preV.center.x + preV.frame.size.width, newV.center.y);}
completion
:^(BOOL finished){
[preV removeFromSuperview];
window
.rootViewController = self.destinationViewController;
}];

}

É isso aí! Aqui está o código-fonte do projeto concluído: https://github.com/rfunk82/CustomSegue