Pergunta

Eu tenho um aplicativo que tem uma visão central com duas visualizações para cada lado. Quero ter dois botões da barra de navegação, à esquerda e à direita, que empurram um novo controlador de navegação para a vista da esquerda ou da direita.

Quando você altera as visualizações pressionando uma nova visualização usando o PushViewController: Método do NavigationController, a visualização parece deslizar da direita. Como faço para mudar isso para deslizar da esquerda?

Foi útil?

Solução

Em vez de usar um controlador de navegação, eu apenas moveria a visualização.

CGRect inFrame = [currentView frame];
CGRect outFrame = firstFrame;
outFrame.origin.x -= inFrame.size.width;

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];

[newView setFrame:inFrame];
currentView setFrame:outFrame];

[UIView commitAnimations];

Outras dicas

Eu fiz a direção da animação de mudança quando pressionamos o ViewController. você pode mudar o tipo de animação aqui Setsubtype de animação: KcatransitionFromright];

 ViewController *elementController = [[ViewController alloc] init];

// set the element for the controller
ViewController.element = element;


// push the element view controller onto the navigation stack to display it

CATransition *animation = [CATransition animation];
[[self navigationController] pushViewController:elementController animated:NO];
[animation setDuration:0.45];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromRight];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]];
[[elementController.view layer] addAnimation:animation forKey:@"SwitchToView1"];

[elementController release];

Eu não acho que você possa definir explicitamente a direção deslizante nos controladores de uinavigation. O que você pode fazer é tirar a visualização atual da pilha de navegação para mostrar a visão anterior, o que animaria da maneira que você deseja. No entanto, isso pode ser complexo se você quiser ter diferentes controladores de exibição, dependendo do que você faz na visualização atual.

Se o seu fluxo de trabalho não for muito complicado, você poderá manter uma referência ao controlador de exibição anterior no controlador de exibição atual. Dependendo do que você faz na visualização atual (como selecionar uma célula de exibição de tabela), você pode alterar os dados necessários no controlador de exibição anterior e depois ligar para

[self.navigationController popViewController];

Ou qualquer que seja o método correto (acho que é bem próximo de como é). Isso permitiria que você desça a pilha de navegação com a animação desejada, que funciona se sua pilha de navegação tiver um número definido de visualizações.

Para o que Reed Olsen disse: Você deve conectar apenas um botão, que inicia o slide para o mesmo método e adicionar um bool que rastreia se a visualização for mostrada ou não. Tudo o que você precisa fazer é definir a origem corretamente.

- (IBAction)slideMenuView 
{
  CGRect inFrame = [self.view frame];
  CGRect outFrame = self.view.frame;

  if (self.viewisHidden) {
    outFrame.origin.x += inFrame.size.width-50;
    self.viewisHidden = NO;
  } else {
    outFrame.origin.x -= inFrame.size.width-50;
    self.viewisHidden = YES;
  }
  [UIView beginAnimations:nil context:nil];
  [UIView setAnimationDuration:0.5];
  [self.menuView setFrame:inFrame];
  [self.view setFrame:outFrame];
  [UIView commitAnimations];
}

Para obter o botão "pontudo", você precisa usar um método diferente.

No seu appdelegate:

UITableViewController *first = [[RootViewController alloc] initWithStyle:UITableViewStylePlain];
UITableViewController *second = [[SomeOtherViewController alloc] initWithStyle:UITableViewStylePlain];

NSArray *stack = [NSArray arrayWithObjects: first, second, nil];

UINavigationController *nav = [[UINavigationController alloc] init];
[nav setViewControllers:stack animated:NO];

Você pode herdar rtlnavigationController: UinavigationController e substituir essas funções.

 - (void) pushViewController:(UIViewController *)viewController animated:(BOOL)animated
 {
     DummyViewController*dvc = [[DummyViewController alloc] init];
     [super pushViewController:viewController animated:NO];
     [super pushViewController:dvc animated:NO];
     [dvc release];
     [super popViewControllerAnimated:YES];
}

e

- (UIViewController *)popViewControllerAnimated:(BOOL)animated
{
 UIViewController *firstViewController = [super popViewControllerAnimated:NO];
 UIViewController *viewController = [super popViewControllerAnimated:NO];
 [super pushViewController:viewController animated:animated];
 return firstViewController;
} 

E no delegado de aplicativo:

navCon = [[RTLNavigationController alloc] init];

rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
rootViewController.contextDelegate = self;

DummyViewController *dvc = [[DummyViewController alloc]init];
[navCon pushViewController:dvc animated:NO];
[dvc release];

[navCon pushViewController:rootViewController animated:NO];
[self.window addSubview:navCon.view];

Empurrar será da esquerda para a direita e aparecendo da direita para a esquerda

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top