Pregunta

Tengo una aplicación que tiene una vista de centro con dos puntos de vista frente a cada lado de ella. Quiero tener dos botones de la barra de navegación izquierda y derecha, que empujan un nuevo controlador de navegación en la vista desde la izquierda o la derecha.

Cuando se cambian las vistas empujando una nueva vista utilizando el pushviewController: Forma de NavigationController, la vista parece deslizarse por la derecha. ¿Cómo puedo cambiar esto a deslizarse por la izquierda?

¿Fue útil?

Solución

En lugar de utilizar un controlador de navegación, me acaba de mover 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];

Otros consejos

He hecho cambiar de dirección animación cuando empujamos viewcontroller. se puede cambiar el tipo de animación aquí [setSubtype animación: 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];

No creo que se puede definir de forma explícita en la dirección de deslizamiento UINavigationControllers. Lo que podría ser capaz de hacer es pop la vista actual de la pila de navegación para mostrar la vista previa, lo que animará a la manera que desee. Sin embargo esto puede ser complejo si quieren tener diferentes controladores de vista aparecen dependiendo de lo que haces en la vista actual.

Si el flujo de trabajo no es demasiado complicado, puede mantener una referencia al controlador de vista previa en el controlador de vista actual. dependiendo de lo que haces en la vista actual (como seleccionar una celda vista de tabla), puede cambiar todos los datos que necesita en el controlador de vista previa, y luego llamar a

[self.navigationController popViewController];

o lo que sea el método correcto es (creo que es bastante cercano a la forma en que lo es). que le permiten desplazarse por la pila de navegación con la animación que desea, que funciona si su pila de navegación tiene un número determinado de puntos de vista sobre el mismo.

a lo Reed Olsen dijo: sólo se debe conectar un botón, que comienza el tobogán hasta el mismo método y añadir un BOOL que rastrea si se muestra o no la vista. todo lo que necesita hacer es establecer el origen correctamente.

- (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 obtener el botón de tipo "puntiagudo" es necesario utilizar un método diferente.

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

Puede heredar RTLNavigationController:. UINavigationController y sobrescribir estas funciones

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

y

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

Y en delegado de aplicación:

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

Empujar será de izquierda a derecha y apareciendo de derecha a izquierda

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top