8

Ho un'app che ha una vista centrale con due viste su ciascun lato. Voglio avere due pulsanti della barra di navigazione, sinistra e destra, che spingono un nuovo controller di navigazione sulla vista da sinistra o destra.iPhone Spingere il controller di visualizzazione nella direzione sinistra

Quando si modificano le visualizzazioni premendo una nuova vista utilizzando il comando pushviewController: NavigationController, la vista sembra scorrere da destra. come posso cambiare questo per entrare da sinistra?

risposta

8

Invece di utilizzare un controller di navigazione, sposterei semplicemente la vista.

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]; 
+0

quindi caricare il controller di visualizzazione nel modo normale, quindi ottenere una maniglia sulla vista, quindi spostarlo? Dovrei anche cambiare manualmente i pulsanti della barra di navigazione e –

+0

. Caricare normalmente il controller della vista e spostare currentView fuori dallo schermo e spostare newView in. –

+0

questo funziona (devi sostituire il - = con un + =) per far scorrere in avanti da sinistra. tuttavia ciò significa eseguire manualmente tutti i pulsanti avanti e indietro per ciascuna vista. che dolore. –

4

Non penso che sia possibile definire esplicitamente la direzione di scorrimento in UINavigationControllers. Quello che potresti essere in grado di fare è inserire la vista corrente dalla pila di navigazione per mostrare la vista precedente, che si animerà nel modo desiderato. Tuttavia questo può essere complesso se si desidera che vengano visualizzati controller di visualizzazione diversi a seconda di ciò che si fa nella vista corrente.

Se il flusso di lavoro non è troppo complicato, è possibile mantenere un riferimento al controller della vista precedente nel controller della vista corrente. a seconda di ciò che si fa nella vista corrente (come selezionare una cella vista tabella), è possibile modificare qualsiasi dato è necessario nel controller della vista prima, e quindi chiamare

[self.navigationController popViewController]; 

o qualunque sia il metodo corretto è (credo è abbastanza vicino a come è). che ti consente di spostarti verso il basso nella pila di navigazione con l'animazione desiderata, il che funziona se il tuo stack di navigazione ha un numero di visualizzazioni impostato su di esso.

0

Per ottenere il pulsante di tipo "a punta" è necessario utilizzare un metodo diverso.

Nel vostro 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]; 
9

ho fatto cambiare direzione dell'animazione quando spingiamo viewcontroller. qui puoi modificare il tipo di animazione [set di animazioneSubtype: 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]; 
+1

Rende nero il precedente controller di visualizzazione, che è una cosa negativa. –

0

È possibile ereditare RTLNavigationController: UINavigationController e sovrascrivere queste funzioni.

- (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 in applicazione delegato:

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]; 

Premendo sarà da sinistra a destra e popping da destra a sinistra

3

a quello che ha detto Reed Olsen: devi solo agganciare un pulsante, che avvia la diapositiva con lo stesso metodo e aggiunge un BOOL che tiene traccia se t la vista è mostrata o meno. tutto ciò che devi fare è impostare correttamente l'origine.

- (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]; 
}