2010-07-11 4 views
8

http://www.irovr.com/stackOverflow/overlap.pngPourquoi ma barre de navigation est-elle sous ma barre d'état?

- (void)viewDidLoad { 
     [super viewDidLoad]; 
     [self setWantsFullScreenLayout:YES]; 
     [mainScrollView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onMainScrollTap:)]]; 
    } 

- (void)onMainScrollTap:(id)sender { 
    if(self.navigationController.navigationBar.hidden){ 
     [self.navigationController setNavigationBarHidden:NO animated:YES]; 
     [self.navigationController setToolbarHidden:NO animated:NO]; 
     [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; 
    }else{ 
     [self.navigationController setNavigationBarHidden:YES animated:YES]; 
     [self.navigationController setToolbarHidden:YES animated:YES]; 
     [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]; 
    } 
} 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent]; 
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]; 

    self.navigationController.navigationBar.translucent = YES; 
    self.navigationController.toolbar.translucent = YES; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self.navigationController setNavigationBarHidden:YES animated:YES]; 
    [self.navigationController setToolbarHidden:YES animated:YES]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; 
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; 
    self.navigationController.navigationBar.translucent = NO; 
    self.navigationController.toolbar.translucent = NO; 
    [self.navigationController setNavigationBarHidden:NO animated:YES]; 
    [self.navigationController setToolbarHidden:YES animated:NO]; 
} 

Répondre

11

Il semble que le fait de masquer la barre d'état et la barre de navigation en même temps cause ce problème. J'ai été capable de le résoudre en cachant/montrant la barre de navigation avec performSelector:withObject:afterDelay, même avec un retard de 0

+8

Cela a fonctionné pour moi aussi. J'ai été capable de l'obtenir pour "re-frame" en réglant 'navigationBarHidden' sur YES et ensuite NO immédiatement. –

0

Votre point de vue est trop grande, il est donc de se tirer sous la barre d'état. Si vous utilisez Interface Builder pour le créer en tant que .xib, vous devez activer le paramètre de la barre d'état sous "Simulated Interface Elements", ou simplement réduire la hauteur de votre vue manuellement.

+0

Ce ne l'est pas. Ma vue est dimensionnée de manière appropriée. Peut-être aurais-je dû mentionner que cela n'arrive que lorsque j'ai caché le statut et les barres de navigation et que je les montre à nouveau. La vue est destinée à basculer entre le plein écran et non, tout comme l'application photos. –

5

L'utilisation de "performSelector" fonctionnera.

Toutefois, certains peuvent trouver plus facile d'ajouter ce qui suit à "viewWillDisappear" même s'il existe déjà une instruction qui affiche la barre de navigation.

[self.navigationController setNavigationBarHidden:YES animated:NO]; 
[self.navigationController setNavigationBarHidden:NO animated:NO]; 
0
- (void)fixNavigationBarUnderStatusbarBug 
{ 
   //This method fix bug! Don't cut it 
   //Bug: Statusbar hide navigationBar after device rotation. 
   if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 
       NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; 
       NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; 
       [center addObserverForName:UIDeviceOrientationDidChangeNotification object:nil 
                            queue:mainQueue usingBlock:^(NSNotification *note) { 
                                UIApplication *currentApplication = [UIApplication sharedApplication]; 
                                if (currentApplication.statusBarHidden) { 
                                    [currentApplication setStatusBarHidden:NO]; 
                                    double delayInSeconds = .1; 
                                    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
                                    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
                                        [currentApplication setStatusBarHidden:YES]; 
                                    }); 
                                } 
                            }]; 
   } 
} 
Questions connexes