2010-06-02 8 views
10

Est-il possible d'utiliser un UINavigationController de manière à ce qu'il n'utilise pas la fenêtre complète?UINavigationController non plein écran

J'ai essayé de définir le cadre de la vue et d'ajouter sa vue à une autre vue (non plein écran) au lieu de la fenêtre, et aucune ne semble fonctionner.

+0

Comment avez-vous résolu ceci? – Zebs

+0

@bentford Comment * as-tu résolu ceci? –

+1

Qui étiez-vous, DenverCode9? QU'AS-TU VU?! – buley

Répondre

0

Il est difficile de répondre parce que c'est compliqué.

Sur iPhone, vous ne pouvez pas avoir un UINavigationController plus court que l'écran. Donc, si vous souhaitez afficher une bannière publicitaire, affichez-la au-dessus de la barre d'outils inférieure ou en dessous de la barre de navigation supérieure.

Sur iPad, vous pouvez avoir deux contrôleurs UINavigation côte à côte, mais dans mon cas, ils prennent toute la hauteur de l'écran. Compte tenu du comportement de l'iPhone, je n'ai pas essayé de modifier le comportement de la hauteur sur l'iPad.

6

Vous ne pouvez pas modifier directement la taille d'un UINavigationController ou de ses sous-vues, car UINavigationController les redimensionne automatiquement en plein écran, quel que soit le réglage de leurs cadres. La seule façon que je suis en mesure de surmonter ce jusqu'à présent est la suivante:

D'abord, créer une instance de UINavigationController comme vous le feriez normalement:

UINavigationController *nc = [[UINavigationController alloc] init]; 
self.navController = nc; 
[nc release]; 

Ensuite, créez une instance de UIView, contraint de la taille que vous voulez vraiment:

UIView *navView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, DESIRED_HEIGHT)]; 
navView.clipsToBounds = YES; 
[navView addSubview:self.navController.view]; 
[self.view addSubview:navView]; 
[navView release]; 

la propriété de NavView clipsToBounds doit être réglé sur OUI, ou la UINavigationController et sa vue apparaît toujours plein écran. Ensuite, ajoutez le UINavigationController à cette vue contrainte. Cet UIView peut ensuite être ajouté à la vue de UIViewController, comme vu ci-dessus. Le point à noter est que les vues de UIViewController ajoutées à UINavigationController verront toutes leur contenu contraint aux limites de navView, et non le cadre des sous-vues ajoutées à UINavigationController, de sorte que le contenu de chaque sous-vue doit être créé pour afficher correctement pour les limites de navView.

Dans tous les cas, cette technique fonctionne, car j'ai créé une application qui l'utilise avec succès. La seule autre façon que j'ai pu faire pour que cela fonctionne est de créer une classe de contrôleur de navigation personnalisée à partir de zéro, répliquant la fonctionnalité de UINavigationController, mais sans le redimensionnement automatique (ce que j'ai déjà fait dans le passé), et cela peut être une douleur. J'espère que cela t'aides.

+1

je t'aime, merci –

4

Ceci est mon premier post, bien que j'aie appris une quantité énorme de cette communauté. Donc, je voulais vous remercier tous pour cela. Mon défi, et la raison pour laquelle je poste ici, était de répondre à cette question et de la refactoriser pour mes besoins, en utilisant iOS5 et les storyboards. Cette solution ne fonctionnera probablement pas bien pour les implémentations plus anciennes, mais je pensais que je posterais quand même.

Voici ce que j'ai fini par, et il fonctionne bien (application iPad).Tout est configuré sur mon UIViewController par défaut, défini en tant que root dans la vue de storyboard.

Espérons que ça aide!

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 



    // Do any additional setup after loading the view, typically from a nib. 

    /*vars: 
    rightSideView is the containing view - this is where the UINavigationController will sit, along with it's view stack 
    myStoryboard is self-explanatory I think 
    myViewController is identified as in storyboard as "accountView", to be pulled from the storyboard and used as the rootview 
    */ 


    //Steps 

    //Add subview to this controller's view (for positioning) 


    UIView *rightSideView = [[UIView alloc]initWithFrame:CGRectMake(30, 30, 500, 600)]; 
    rightSideView.clipsToBounds = YES;//this little baby makes sure that the damn navigation bar clips!! 

    rightSideView.backgroundColor = [UIColor grayColor];//so I can see it 

    //instantiate view controller for nav controller's root view 
    UIStoryboard *myStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]]; 
    UIViewController *myViewController = [myStoryboard instantiateViewControllerWithIdentifier:@"accountView"]; 

    //create NavController 
    UINavigationController *myNavController = [[UINavigationController alloc]initWithRootViewController:myViewController]; 

    //Add navController as one of my child ViewControllers 

    [self addChildViewController:myNavController]; 

    //Add NavController's view into my constrained view 
    [rightSideView addSubview:myNavController.view]; 

    //Finally, add right side view as a subview of myself 
    [self.view addSubview:rightSideView]; 



} 
+0

C'est ce dont j'avais besoin, merci! –