109 votes

iOS 7 - La barre d'état empiète sur l'affichage

J'ai un ViewController qui se trouve dans un UINavigationcontroller, mais la barre de navigation est cachée. Lorsque je lance l'application sous iOS 7, la barre d'état s'affiche au-dessus de ma vue. Existe-t-il un moyen d'éviter cela ?

Je ne veux pas écrire de code spécifique au système d'exploitation.

Enter image description here

J'ai essayé de mettre View controller-based status bar appearance a NO mais cela n'a pas résolu le problème.

95voto

aryaxt Points 15011

Xcode 5 a iOS 6/7 Deltas qui est spécialement conçu pour résoudre ce problème. Dans le storyboard, j'ai déplacé mes vues de 20 pixels vers le bas pour qu'elles aient l'air correctes sous iOS 7 et, pour les rendre compatibles avec iOS 6, j'ai modifié les éléments suivants Delta y à -20.

enter image description here

Étant donné que mon storyboard n'utilise pas la mise en page automatique, pour redimensionner correctement la hauteur des vues sous iOS 6, j'ai dû paramétrer Delta height ainsi que Delta Y .

69voto

Nathan H Points 9956

Si vous ne voulez tout simplement PAS de barre d'état, vous devez mettre à jour votre plist avec ces données : Pour ce faire, dans le plist, ajoutez ces 2 paramètres :

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

Dans iOS 7, vous êtes censé concevoir votre application en tenant compte d'une barre d'état transparente superposée. Voir la nouvelle application météo d'iOS 7 par exemple.

43voto

Vincent Points 706

C'est le comportement par défaut de UIViewController sous iOS 7. La vue sera en plein écran, ce qui signifie que la barre d'état couvrira le haut de votre vue.

Si vous avez un UIViewController dans un UINavigationController et que la barre de navigation est visible, vous pouvez avoir le code suivant dans votre viewDidLoad ou faire en sorte qu'une image d'arrière-plan pour la barre de navigation fasse l'affaire.

self.edgesForExtendedLayout = UIRectEdgeNone;

Si la barre de navigation est masquée, vous devez ajuster tous les éléments UIView en décalant de 20 points. Je ne vois pas d'autre solution. L'utilisation de la mise en page automatique aidera un peu.

Voici l'exemple de code permettant de détecter la version d'iOS, si vous souhaitez assurer la rétrocompatibilité.

NSUInteger DeviceSystemMajorVersion() {
    static NSUInteger _deviceSystemMajorVersion = -1;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        NSString *systemVersion = [UIDevice currentDevice].systemVersion;
        _deviceSystemMajorVersion = [[systemVersion componentsSeparatedByString:@"."][0] intValue];
    });

   return _deviceSystemMajorVersion;
}

15voto

comonitos Points 1238

La seule solution qui fonctionne que j'ai faite moi-même.

Voici ma sous-classe UIViewController https://github.com/comonitos/ios7_overlaping

1 Sous-classe de UIViewController

2. Sous-classez votre window.rootViewController à partir de cette classe.

3 Voila !

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

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect screen = [[UIScreen mainScreen] bounds];
        if (self.navigationController) {
            CGRect frame = self.navigationController.view.frame;
            frame.origin.y = 20;
            frame.size.height = screen.size.height - 20;
            self.navigationController.view.frame = frame;
        } else {
            if ([self respondsToSelector: @selector(containerView)]) {
                UIView *containerView = (UIView *)[self performSelector: @selector(containerView)];

                CGRect frame = containerView.frame;
                frame.origin.y = 20;
                frame.size.height = screen.size.height - 20;
                containerView.frame = frame;
            } else {
                CGRect frame = self.view.frame;
                frame.origin.y = 20;
                frame.size.height = screen.size.height - 20;
                self.view.frame = frame;
            }
        }
    }
}

4 Ajoutez ceci pour rendre votre barre d'état blanche Juste après le [self.window makeKeyAndVisible] ; ! !!

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}

13voto

Darshit Shah Points 251
-(UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

-(void)viewWillLayoutSubviews{

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
  {
    self.view.clipsToBounds = YES;
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenHeight = 0.0;
    if(UIDeviceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))
        screenHeight = screenRect.size.height;
    else
        screenHeight = screenRect.size.width;
    CGRect screenFrame = CGRectMake(0, 20, self.view.frame.size.width,screenHeight-20);
    CGRect viewFrame1 = [self.view convertRect:self.view.frame toView:nil];
    if (!CGRectEqualToRect(screenFrame, viewFrame1))
    {
        self.view.frame = screenFrame;
        self.view.bounds = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    }
  }
}

Ajouter une clé dans la liste ---- Afficher l'apparence de la barre d'état basée sur le contrôleur : NON

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