Question

J'ai une application qui a une vue centrale avec deux vues au large de chaque côté de celui-ci. Je veux avoir deux boutons de la barre de navigation, à gauche et à droite qui poussent un nouveau contrôleur de navigation sur le point de vue de la gauche ou la droite.

Lorsque vous changez d'écran en appuyant sur une nouvelle vue à l'aide de la pushviewController: méthode de NavigationController, la vue semble glisser sur le côté droit. Comment puis-je changer cela pour faire glisser de la gauche?

Était-ce utile?

La solution

Au lieu d'utiliser un contrôleur de navigation, je voudrais juste déplacer la vue.

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

Autres conseils

Je l'ai fait la direction de l'animation de changement quand nous poussons viewcontroller. vous pouvez changer le type d'animation ici [animation 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];

Je ne pense pas que vous pouvez définir explicitement direction de glissement dans UINavigationControllers. Ce que vous pourriez être en mesure de le faire est pop la vue actuelle de la pile de navigation pour afficher la vue avant, qui animerait de la manière que vous voulez. Cependant, cela peut être complexe si vous voulez avoir des contrôleurs de vue apparaissent en fonction de ce que vous faites sur la vue actuelle.

Si votre flux de travail est pas trop compliqué, vous pouvez tenir une référence au contrôleur de vue avant dans le contrôleur de vue en cours. en fonction de ce que vous faites sur la vue en cours (comme sélectionner une vue de table cellulaire), vous pouvez modifier toutes les données dont vous avez besoin dans le contrôleur de vue avant, puis appelez

[self.navigationController popViewController];

ou quelle que soit la bonne méthode est (je pense que c'est assez proche de la façon dont il est). qui vous permettent de passer en bas de la pile de navigation avec l'animation que vous voulez, qui fonctionne si votre pile de navigation a un certain nombre de vues sur elle.

à ce que Reed Olsen a dit: vous ne devez brancher un seul bouton, qui commence la diapositive jusqu'à la même méthode et ajouter un BOOL qui suit si la vue est affichée ou non. tout ce que vous devez faire est de définir l'origine correctement.

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

Pour obtenir le bouton de type « pointu », vous devez utiliser une autre méthode.

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

Vous pouvez hériter RTLNavigationController. UINavigationController et remplacer ces fonctions

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

et

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

Et en application de déléguer:

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

Repousser sera de gauche à droite et sauter de droite à gauche

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top