Os NavigationControllers têm pilhas de ViewController para gerenciar e transições de animação limitadas.
A adição de um controlador de visualização como uma subvisão a um controlador de visualização existente requer a passagem de eventos para o controlador de subvisão, o que é uma tarefa difícil de gerenciar, carregada com poucos aborrecimentos e, em geral, parece um hack ruim na implementação (a Apple também recomenda Fazendo isso).
A apresentação de um controlador de exibição modal novamente coloca um controlador de exibição em cima de outro e, embora não tenha os problemas de passagem de eventos descritos acima, ele realmente não "troca" o controlador de exibição, ele o empilha.
Os storyboards são limitados ao iOS 5 e são quase ideais, mas não podem ser usados em todos os projetos.
Alguém pode apresentar um EXEMPLO DE CÓDIGO SÓLIDO para alterar os controladores de exibição sem as limitações acima e permitir transições animadas entre eles?
Um exemplo próximo, mas sem animação: Como usar vários controladores de exibição personalizada do iOS sem um controlador de navegação
Edit: O uso do Nav Nav Controller é bom, mas é necessário que haja estilos de transição animados (não apenas os efeitos de slide); o controlador de exibição mostrado precisa ser trocado completamente (não empilhado). Se o segundo controlador de exibição precisar remover outro controlador de exibição da pilha, ele não será encapsulado o suficiente.
Editar 2: o iOS 4 deve ser o sistema operacional base para esta pergunta, eu deveria ter esclarecido isso ao mencionar os storyboards (acima).
fonte
Respostas:
EDIT: Nova resposta que funciona em qualquer orientação. A resposta original funciona apenas quando a interface está na orientação retrato. São animações de transição de vista b / c que substituem uma vista por uma vista diferente, devem ocorrer com vistas pelo menos um nível abaixo da primeira vista adicionada à janela (por exemplo
window.rootViewController.view.anotherView
).Eu implementei uma classe simples de contêiner que chamei
TransitionController
. Você pode encontrá-lo em https://gist.github.com/1394947 .Como um aparte, prefiro a implementação em uma classe separada porque é mais fácil reutilizar. Se você não quiser isso, basta implementar a mesma lógica diretamente no delegado do aplicativo, eliminando a necessidade da
TransitionController
classe. A lógica que você precisaria seria a mesma, no entanto.Use-o da seguinte maneira:
No delegado do seu aplicativo
Para fazer a transição para um novo controlador de exibição de qualquer controlador de exibição
EDIT: resposta original abaixo - só funciona para orientação portait
Fiz as seguintes suposições para este exemplo:
Você tem um controlador de exibição atribuído como
rootViewController
da sua janelaQuando você alterna para uma nova visualização, deseja substituir o viewController atual pelo viewController que possui a nova visualização. A qualquer momento, apenas o viewController atual está ativo (por exemplo, alocado).
O código pode ser facilmente modificado para funcionar de maneira diferente, o ponto principal é a transição animada e o controlador de visualização única. Certifique-se de não manter um controlador de exibição em nenhum lugar fora da atribuição a ele
window.rootViewController
.Código para animar a transição no delegado do aplicativo
Exemplo de uso em um controlador de exibição
fonte
TransitionController.m
paraUIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
, mas só o usei na versão mais recente do iOS, portanto teste cuidadosamente.Você pode usar o novo sistema de contenção viewController da Apple. Para informações mais detalhadas, consulte o vídeo da sessão da WWDC 2011 "Implementing
UIViewController
Conttainment".Novo no iOS5, o
UIViewController
Containment permite que você tenha um viewController pai e um número de viewControllers filhos contidos nele. É assim que o UISplitViewController funciona. Fazendo isso, você pode empilhar os controladores de exibição em um pai, mas para seu aplicativo específico, você está apenas usando o pai para gerenciar a transição de um viewController visível para outro. Essa é a maneira aprovada pela Apple de fazer as coisas e a animação a partir de um único controle de exibição infantil é indolor. Além disso, você pode usar todas as váriasUIViewAnimationOption
transições diferentes !Além disso, com o UIViewContainment, você não precisa se preocupar, a menos que queira, com a bagunça de gerenciar os viewControllers filhos durante eventos de orientação. Você pode simplesmente usar o seguinte para garantir que seu parentViewController encaminhe eventos de rotação para os viewControllers filhos.
Você pode fazer o seguinte ou semelhante no método viewDidLoad de seus pais para configurar o primeiro childViewController:
quando você precisar alterar o viewController filho, chame algo semelhante ao seguinte no viewController pai:
Publiquei um projeto de exemplo completo aqui: https://github.com/toolmanGitHub/stackedViewControllers . Este outro projeto mostra como usar o
UIViewController
Containment em vários tipos de viewController de entrada que não ocupam a tela inteira. Boa sortefonte
[self.currentViewController willMoveToParentViewController:nil];
antes da transição?OK, eu sei que a pergunta diz sem usar um controlador de navegação, mas não há razão para não fazê-lo. A OP não estava respondendo aos comentários a tempo de eu ir dormir. Não vote em mim. :)
Veja como abrir o controlador de exibição atual e alternar para um novo controlador de exibição usando um controlador de navegação:
fonte
Como acabei de encontrar esse problema exato e tentei variações de todas as respostas pré-existentes para um sucesso limitado, postarei como resolvi o problema:
Conforme descrito nesta postagem sobre sequências personalizadas , é realmente muito fácil fazer sequências personalizadas. Eles também são super fáceis de conectar no Interface Builder, mantêm os relacionamentos no IB visíveis e não exigem muito suporte dos controladores de exibição de origem / destino do segue.
A postagem vinculada acima fornece o código do iOS 4 para substituir o atual controlador de vista superior na pilha navigationController por um novo usando uma animação slide-in-from-top.
No meu caso, eu queria uma substituição semelhante segue, mas com uma
FlipFromLeft
transição. Eu também só precisava de suporte para o iOS 5 ou superior. Código:De RAFlipReplaceSegue.h:
De RAFlipReplaceSegue.m:
Agora, arraste com a tecla Control pressionada para configurar qualquer outro tipo de segue, em seguida, torne-o personalizado segue e digite o nome da classe segue personalizada, e pronto!
fonte
–performSegueWithIdentifier:sender:
método UIViewController .Lutei com esse problema por um longo tempo e um dos meus problemas está listado aqui , não tenho certeza se você teve esse problema. Mas aqui está o que eu recomendaria se ele deve funcionar com o iOS 4.
Primeiro, crie uma nova
NavigationController
classe. É aqui que faremos todo o trabalho sujo - outras classes poderão "limpa" chamar métodos de instância comopushViewController:
esses. No seu.h
:A matriz de controladores de exibição filho servirá como um armazenamento para todos os controladores de exibição em nossa pilha. Encaminharíamos automaticamente todo o código de rotação e redimensionamento da
NavigationController
visualização para acurrentController
.Agora, em nossa implementação:
Agora você pode implementar seu próprio costume
pushViewController:
,popViewController
e tal, usando essas chamadas de método.Boa sorte, e espero que isso ajude!
fonte
viewWillAppear
,viewDidAppear
e tal.Experimente este código.
Esse código fornece a transição de um controlador de exibição para outro controlador de exibição que possui um controlador de navegação.
fonte