110 votes

presentViewController et affichage de la barre de navigation

J'ai une hiérarchie de contrôleurs de vue et le contrôleur le plus haut est affiché comme un modal et j'aimerais savoir comment afficher la barre de navigation lors de l'utilisation de

'UIViewController:presentViewController:viewControllerToPresent:animated:completion'

La documentation pour 'presentViewController:animated:completion:' note :

Sur l'iPhone et l'iPod touch, l'affichage présenté est i Sur l'iPad, la présentation dépend de la valeur du champ modalPresentationStyle".

Pour 'modalPresentationStyle', les documents disent :

Le style de présentation détermine la manière dont un contrôleur de vue présenté de manière modale est affiché à l'écran. Sur l'iPhone et l'iPod touch, les contrôleurs de vue modaux sont toujours présentés en plein écran, mais sur l'iPad, il existe plusieurs options de présentation.

Existe-t-il un moyen de s'assurer que la barre de navigation est visible sous la barre d'état une fois que le contrôle de vue s'affiche ? Dois-je interpréter le document comme suit : vous n'avez pas d'options sur iPhone/iPod et seulement sur iPad ?

Auparavant, j'utilisais 'UIViewController:presentModalViewController:animated' qui fonctionnait bien, mais depuis iOS 5.0, l'API est obsolète et je passe donc à la nouvelle.

Visuellement, ce que je cherche à faire, c'est faire glisser le nouveau contrôleur depuis le bas de l'écran, comme le faisait l'ancienne API.

[mise à jour avec le code] :

// My root level view:
UIViewController *vc = [[RootViewController alloc] 
                            initWithNibName:nil 
                            bundle:[NSBundle mainBundle]];
navController = [[UINavigationController alloc] initWithRootViewController:vc];        
....

// Within the RootViewController, Second view controller is created and added 
// to the hierarchy. It is this view controller that is responsible for 
// displaying the DetailView:
SecondTierViewController *t2controller = [[SecondTierViewController alloc] 
                                           initWithNibName:nil
                                           bundle:[NSBundle mainBundle]];

[self.navigationController pushViewController:t2controller animated:YES];

// Created by SecondTierViewController 
DetailViewController *controller = [[DetailViewController alloc] initWithNibName:nil                                                                                 
                                        bundle:[NSBundle mainBundle]];  

controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
controller.modalPresentationStyle = UIModalPresentationCurrentContext;

[self.navigationController presentViewController:controller 
                                        animated:YES 
                                        completion:nil];

198voto

Manish Ahuja Points 1611

Il est vrai que si vous présentez un contrôleur de vue de manière modale sur l'iPhone, il sera toujours présenté en plein écran, quelle que soit la manière dont vous le présentez sur le contrôleur de vue supérieur d'un contrôleur de navigation ou de toute autre manière. Mais vous pouvez toujours afficher la barre de navigation avec la solution de contournement suivante :

Plutôt que de présenter ce contrôleur de vue de manière modale, présentez un contrôleur de navigation de manière modale avec son contrôleur de vue racine défini comme le contrôleur de vue souhaité :

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:nil bundle:nil];
UINavigationController *navigationController = 
    [[UINavigationController alloc] initWithRootViewController:myViewController];

//now present this navigation controller modally 
[self presentViewController:navigationController
                   animated:YES
                   completion:^{

                        }];

Vous devriez voir une barre de navigation lorsque votre vue est présentée de manière modale.

61voto

Tal Zion Points 2789

*`Swift 5.`**

Navigation :

guard let myVC = self.storyboard?.instantiateViewController(withIdentifier: "MyViewController") else { return }
let navController = UINavigationController(rootViewController: myVC)

self.navigationController?.present(navController, animated: true, completion: nil)

Retour en arrière :

self.dismiss(animated: true, completion: nil)

Swift 2.0

Navigation :

let myVC = self.storyboard?.instantiateViewControllerWithIdentifier("MyViewController");
let navController = UINavigationController(rootViewController: myVC!)

self.navigationController?.presentViewController(navController, animated: true, completion: nil)

Retour en arrière :

self.dismissViewControllerAnimated(true, completion: nil)

23voto

marrop Points 46

Pouvez-vous utiliser :

[self.navigationController pushViewController:controller animated:YES];

Retour en arrière (je crois) :

[self.navigationController popToRootViewControllerAnimated:YES];

2voto

Mohammad Parvez Points 349

J'ai eu le même problème sur ios7. Je l'ai appelé dans selector et cela a fonctionné sur ios7 et ios8.

[self performSelector: @selector(showMainView) withObject: nil afterDelay: 0.0];

- (void) showMainView {
    HomeViewController * homeview = [
        [HomeViewController alloc] initWithNibName: @
        "HomeViewController"
        bundle: nil];
    UINavigationController * navcont = [
        [UINavigationController alloc] initWithRootViewController: homeview];
    navcont.navigationBar.tintColor = [UIColor whiteColor];
    navcont.navigationBar.barTintColor = App_Theme_Color;
    [navcont.navigationBar
    setTitleTextAttributes: @ {
        NSForegroundColorAttributeName: [UIColor whiteColor]
    }];
    navcont.modalPresentationStyle = UIModalPresentationFullScreen;
    navcont.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self.navigationController presentViewController: navcont animated: YES completion: ^ {

    }];
}

1voto

ignat980 Points 20

Tous les a [self.navigationController pushViewController:controller animated:YES]; permet d'animer une transition et de l'ajouter à la pile de contrôleurs de navigation, ainsi que d'autres trucs sympas d'animation de la barre de navigation. Si vous ne vous souciez pas de l'animation de la barre, alors ce code debe travail. La barre apparaît bel et bien sur le nouveau contrôleur, et vous obtenez un geste de pop interactif !

//Make Controller
DetailViewController *controller = [[DetailViewController alloc] initWithNibName:nil                                                                                 
                                    bundle:[NSBundle mainBundle]];  
//Customize presentation
controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
controller.modalPresentationStyle = UIModalPresentationCurrentContext;

//Present controller
[self presentViewController:controller 
                   animated:YES 
                 completion:nil];
//Add to navigation Controller
[self navigationController].viewControllers = [[self navigationController].viewControllers arrayByAddingObject:controller];
//You can't just [[self navigationController].viewControllers addObject:controller] because viewControllers are for some reason not a mutable array.

Edit : Désolé, presentViewController remplira tout l'écran. Vous devrez créer une transition personnalisée, avec CGAffineTransform.translation ou autre, animer le contrôleur avec la transition, puis l'ajouter aux viewController du navigationController.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X