Domanda

Ho un app che ha una vista centrale con due punti di vista fuori a ogni lato di essa. Voglio avere due tasti barra di navigazione, destra e sinistra che spingono un nuovo controller di navigazione sulla vista da sinistra o di destra.

Quando si cambia vista spingendo una nuova vista utilizzando il pushviewController: metodo navigationController, la vista sembra scorrere da destra. Come faccio a cambiare questo a scivolare proveniente dalla fascia sinistra?

È stato utile?

Soluzione

Invece di utilizzare un controller di navigazione, vorrei solo spostare 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];

Altri suggerimenti

Ho fatto cambiare direzione dell'animazione quando spingiamo viewcontroller. è possibile cambiare il tipo di animazione qui [animazione setSubtype: 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];

Non credo che si può definire in modo esplicito in direzione di scorrimento UINavigationControllers. Che cosa si potrebbe essere in grado di fare è pop la vista corrente dallo stack di navigazione per mostrare la vista prima, che avrebbe animare in modo che si desidera. Tuttavia questo può essere complessa se si vuole avere diversi controller di vista appaiono a seconda di ciò che si fa nella vista corrente.

Se il flusso di lavoro non è troppo complicato, si può tenere un riferimento al controller della vista prima 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 che sia abbastanza vicino a come è). che avrebbe lasciato si sposta verso il basso la pila del nav con l'animazione che si desidera, che funziona se il vostro stack nav ha un determinato numero di punti di vista su di esso.

a quello che Reed Olsen ha detto: è necessario collegare solo fino un pulsante, che avvia la slitta fino allo stesso metodo e aggiungere un BOOL che tiene traccia se la vista è mostrato o meno. tutto quello che dovete 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];
}

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

È 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 nella delegato applicazione:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top