58 votes

Problème de barre d'état et de barre de navigation dans IOS7

Je suis en train de migrer mon application vers iOS 7. Pour résoudre le problème de la barre d'état, j'ai ajouté ce code

if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f)
{
    CGRect frame = self.navigationController.view.frame;
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        frame.origin.y = 20;
    }
    else
    {
        frame.origin.x = 20;
    }
    [self.navigationController.view setFrame:frame];
}

Cela fonctionne bien dans le cas normal. Si je change d'orientation (l'application ne prend en charge que l'orientation paysage) ou si je présente un contrôleur de vue et que je rejette le contrôleur de vue modèle, l'alignement du contrôleur de vue change. La barre d'état chevauche à nouveau mon contrôleur de vue. Ce morceau de code ne fonctionne pas du tout. Veuillez me guider pour résoudre ce problème de barre d'état.

Cas 2 : Voici comment je présente mon contrôleur de vue

ZBarReaderViewController *reader = [ZBarReaderViewController new];
reader.readerDelegate = self;

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    reader.supportedOrientationsMask = ZBarOrientationMaskLandscape;
else
    reader.supportedOrientationsMask = ZBarOrientationMaskPortrait;

    [self presentModalViewController:reader animated:YES];

Réf :

enter image description here

Merci d'avance.

0 votes

Comme je l'ai mentionné, si l'orientation change la barre d'état, le problème se produit, et pas seulement dans le cas du presentmodelviewcontroller.

1 votes

Voici une réponse directe à cette question : stackoverflow.com/questions/18775874/

133voto

Ganapathy Points 3174

Correction du problème de la barre d'état dans IOS 7

J'ai finalement résolu le problème de dépassement de la barre d'état en utilisant la propriété valeur delta dans xcode5. Tout d'abord, j'ai augmenté l'origine - y de 20pxl à tous les contrôleurs utilisés dans le Xib (il semble que cela fonctionne bien seulement dans IOS 7), après cela, j'ai défini la valeur delta pour tous les contrôleurs de vue origine -y à -20, il fonctionne bien dans les deux iOS 6 et iOS 7.

Les étapes pour y parvenir.

Xcode 5 fournit une option de prévisualisation pour voir l'apparence du xib dans différentes vues basées sur la version de l'OS.

Choisissez l'option d'aperçu dans l'éditeur adjoint

Click assistant rédacteur

enter image description here

et choisissez l'option "preview" pour prévisualiser le contrôleur de vue sélectionné dans une version différente.

enter image description here

option d'aperçu de la vue du contrôleur de vue.

enter image description here

Dans l'aperçu, vous pouvez trouver l'option de basculement pour l'aperçu de la vue dans différentes versions. Dans l'aperçu, vous pouvez sentir clairement le problème de la barre d'état s'il n'est pas corrigé correctement en basculant la version.

Trois étapes pour résoudre le problème de la barre d'état : étape 1 : Assurez-vous que le afficher la cible us 7.0 et plus dans l'inspecteur de fichiers .

enter image description here

Etape 2 : Augmenter l'origine - y de 20 pixels (exactement la taille de la barre d'état) pour tous les contrôles ajoutés dans le contrôleur de vue.

Etape 3 : Définir la valeur delta de l'origine y à -20 pour tous les contrôles. alors seulement il s'ajustera automatiquement en fonction de la version. Utilisez l'aperçu maintenant et sentez la différence que les contrôles s'ajustent automatiquement en raison de la valeur delta.

enter image description here

Une fois le problème de la barre d'état résolu, le problème de la présentation de la vue du modèle (contrôleur ZbarSDk) est également résolu automatiquement.

Écran de prévisualisation :

enter image description here

10 votes

Laissez un commentaire si vous n'êtes pas satisfait( qui m'a donné un vote négatif -1) de cette réponse. Pour que je puisse améliorer ma réponse.

0 votes

Comment le faire de manière programmatique, si je ne définis pas de .xib ? P.S. Je suis un upvoter :D (à @Ganapathy)

1 votes

Si vous avez ajouté des contrôles de manière programmatique, vous devez augmenter l'origine y à 20 pour tous les contrôles ajoutés (qui sont ajoutés de manière programmatique) si la version du dispositif est d'environ 7.0

15voto

Vizllx Points 1

Je suis en retard pour cette réponse, mais je veux juste partager ce que j'ai fait, qui est essentiellement
le site solution la plus facile

Premier de tous-> Allez à votre info.plist File y ajoutez le Style de la barre d'état->Style noir transparent (Alpha de 0.5)

Maintenant, c'est parti.

Ajoutez ce code dans votre AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
     //Whatever your code goes here
  if(kDeviceiPad){

     //adding status bar for IOS7 ipad
         if (IS_IOS7) {
              UIView *addStatusBar = [[UIView alloc] init];
              addStatusBar.frame = CGRectMake(0, 0, 1024, 20);
              addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //change this to match your navigation bar
              [self.window.rootViewController.view addSubview:addStatusBar];
                    }
                }
    else{

         //adding status bar for IOS7 iphone
        if (IS_IOS7) {
            UIView *addStatusBar = [[UIView alloc] init];
            addStatusBar.frame = CGRectMake(0, 0, 320, 20);
            addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //You can give your own color pattern
            [self.window.rootViewController.view addSubview:addStatusBar];
        }

    return YES;
   }

0 votes

C'est très simple. Vous pouvez le faire dans les 4 premières lignes. Pour une description détaillée, j'ai ajouté l'écran court. J'ai cherché pendant plus d'une heure mais Personne ne suggère d'ajouter une sous-vue dans le contrôleur de vue racine. pour régler ce problème. Il est préférable de gérer les cadres de manière programmatique en cas d'ajout indésirable de la vue secondaire. . c'est tout.

0 votes

Selon votre réponse : la barre d'état se superpose mais pas la vue principale. Elle se superpose à la vue personnalisée que vous avez ajoutée. Ma question est de savoir comment éviter le chevauchement de la barre d'état. J'espère que vous comprenez.

0 votes

Utilisation de l'identifiant non déclaré 'kDeviceiPad'.

6voto

John Points 249
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];

    self.window.rootViewController = self.viewController;

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {

        [application setStatusBarStyle:UIStatusBarStyleLightContent];
         [application setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];

        self.window.clipsToBounds =YES;            
        self.window.frame =CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);
    }

   [self.window makeKeyAndVisible];
    return YES;
}

mettez ce qui suit dans info.plist

Apparence de la barre d'état basée sur le contrôleur = NON ;

3voto

sinh99 Points 2275

Entendez que nous pouvons faire cela pour toutes les vues à la fois

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
// Notification for the orientaiton change
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(applicationDidChangeStatusBarOrientation:)
                                             name:UIApplicationDidChangeStatusBarOrientationNotification
                                           object:nil];

// Window framing changes condition for iOS7 or greater
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    statusBarBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, -20, self.window.frame.size.width, 20)];//statusBarBackgroundView is normal uiview
    statusBarBackgroundView.backgroundColor = [UIColor colorWithWhite:0.000 alpha:0.730];
    [self.window addSubview:statusBarBackgroundView];
    self.window.bounds = CGRectMake(0, -20, self.window.frame.size.width, self.window.frame.size.height);
}
// Window framing changes condition for iOS7 or greater

self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];

return YES;
}

Et si nous utilisons l'orientation, nous pouvons ajouter la méthode ci-dessous dans le délégué de l'application pour la définir via l'orientation.

- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification
{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    statusBarBackgroundView.hidden = YES;
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    int width = [[UIScreen mainScreen] bounds].size.width;
    int height = [[UIScreen mainScreen] bounds].size.height;

    switch (orientation) {
        case UIInterfaceOrientationLandscapeLeft:
            self.window.bounds =  CGRectMake(-20,0,width,height);
            statusBarBackgroundView.frame = CGRectMake(-20, 0, 20, height);
            break;
        case UIInterfaceOrientationLandscapeRight:
            self.window.bounds =  CGRectMake(20,0,width,height);
            statusBarBackgroundView.frame = CGRectMake(320, 0, 20, height);
            break;
        case UIInterfaceOrientationPortraitUpsideDown:
            statusBarBackgroundView.frame = CGRectMake(0, 568, width, 20);
            self.window.bounds =  CGRectMake(0, 20, width, height);
            break;
        default:
            statusBarBackgroundView.frame = CGRectMake(0, -20, width, 20);
            self.window.bounds =  CGRectMake(0, -20, width, height);
            break;
    }
    statusBarBackgroundView.hidden = NO;
}
}

Vous devez ajouter la catégorie de contrôleur de navigation ci-dessous

.h

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
@interface UINavigationController (iOS6fix)

@end

.m

#import "UINavigationController+iOS6fix.h"
@implementation UINavigationController (iOS6fix)  

-(BOOL)shouldAutorotate
{
      return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
      return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
     return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}

@end

3voto

Mandeep Pasbola Points 1663

Pour cacher la barre d'état dans ios7, suivez ces étapes simples :

Dans Xcode, allez dans " Resources "et ouvrez le dossier " (app name)-Info.plist file ".

  • vérifier pour " View controller based status bar appearance "et définir sa valeur " NO "
  • vérifier pour " Status bar is initially hidden "et définir sa valeur " YES "

Si les clés ne sont pas présentes, vous pouvez les ajouter en sélectionnant " information property list "en haut et cliquez sur + icône

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