web-dev-qa-db-fra.com

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

Je migre mon application vers iOS 7. Pour résoudre le problème lié à 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 des cas normaux. 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 quitte le contrôleur de modèle, l'alignement de celui-ci a été modifié. La barre d'état recouvre à 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];

Ref:

enter image description here

Merci d'avance.

57
Ganapathy

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

Finalement, j'ai corrigé la barre d'état au-dessus du tour au moyen de la propriété delta value dans xcode5. D'abord, j'ai origine augmentée - y 20pxl par rapport à tout le contrôleur utilisé dans le Xib (il semble fonctionner correctement uniquement dans IOS 7), après cela i - définissez la valeur delta pour tout le contrôleur de vue Origine -y sur -20, cela fonctionne correctement dans ios 6 et IOS 7.

Étapes pour le faire.

Xcode 5 fournit une option de prévisualisation pour afficher l'apparence de xib dans une vue différente en fonction de la version du système d'exploitation.

choisissez l'option de prévisualisation de l'éditeur assistant

assistant éditeur de clic

enter image description here

et choisissez l’option de prévisualisation pour prévisualiser le contrôleur de vue sélectionné dans une version différente. enter image description here

view controller option d'aperçu de la vue.

enter image description here

dans l'aperçu, vous pouvez trouver l'option de basculement pour prévisualiser la vue dans une version différente. Dans l'aperçu, vous pouvez clairement sentir 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 voyez nous cibler 7.0 et plus tard dans l’inspecteur de fichierenter image description here

Étape 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.

Étape 3: Définissez la valeur delta de Origin y sur -20 pour tous les contrôles alors seul celui-ci s’ajustera automatiquement en fonction de la version. Utilisez l'aperçu maintenant et ressentez les différences que les contrôles ajustent automatiquement en raison de la valeur delta. enter image description here

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

Écran de prévisualisation:

enter image description here

132
Ganapathy

Je suis en retard pour cette réponse, mais je veux juste partager ce que j'ai fait, ce qui est fondamentalement
the solution la plus simple

Premier de tous-> Allez à votre info.plist File et ajouter un style de barre d'état-> style de noir transparent (Alpha de 0,5)

Maintenant, ça y est: -

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;
   }
15
Vizllx
- (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;
}

définir ce qui suit sur info.plist

Apparence de la barre d'état du contrôleur d'affichage = NO;

6
John

Entendez que nous pouvons le faire pour tous les points de vue à 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 pendant que 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 devriez ajouter ci-dessous la catégorie de contrôleur de navigation correspondante

.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
3
sinh99

BEAUCOUP BEAUCOUP réponse plus simple:

Alignez le haut de votre vue sur le "Guide de mise en page supérieur", mais faites glisser le "Guide de mise en forme supérieur" sur votre vue et définissez la contrainte "verticale". Voir cette réponse pour une référence d'image.

La façon dont cela fonctionne est la suivante: le "Guide de mise en page supérieur" s'ajustera automatiquement lorsque la barre d'état est présente ou absente, et tout fonctionnera sans code requis!

P.S. Dans cet exemple particulier, l'arrière-plan situé au bas de l'écran doit également être résolu en définissant une contrainte verticale appropriée du fond de la vue, à son aperçu, ou peu importe ...

3
Brad

Pour masquer la barre d'état dans iOS 7, suivez ces étapes simples:

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

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

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

3
Mandeep Pasbola

j'ai résolu cela en utilisant le code ci-dessous

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {
    if(landScape mode)

       if ([UIDevice currentDevice].systemVersion.floatValue>=7) {
        CGRect frame = self.window.frame;
       frame.size.width -= 20.0f;
      frame.Origin.x+= 20.0f;
       self.window.frame = frame;
    }


 if(portrait)

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

    CGRect frame = self.window.frame;
    frame.Origin.y += 20.0f;
    frame.size.height -= 20.0f;
    self.window.frame = frame;
}
return YES;

 }
1
user2230971
#define _kisiOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

 if (_kisiOS7)
    {
        [[UINavigationBar appearance] setBarTintColor:_kColorFromHEX(@"#011C47")];
    }
    else
    {
        [[UINavigationBar appearance] setBackgroundColor:_kColorFromHEX(@"#011C47")];
        [[UINavigationBar appearance] setTintColor:_kColorFromHEX(@"#011C47")];
    }
1
Mubin Shaikh

il suffit de définir le code suivant dans viewWillAppear.

 if ([[[UIDevice currentDevice] systemVersion] floatValue]<= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
 }
1
Amit Shelgaonkar

Avec Salesforce SDK 2.1 (Cordova 2.3.0), nous devions procéder comme suit pour que la barre d'état apparaisse sur le chargement initial de l'application et revienne de l'arrière-plan (iPhone et iPad):

Contrairement aux autres solutions publiées ici, celle-ci semble survivre à la rotation de l'appareil.

1 -Créer une catégorie de SFHybridViewController

#import "SFHybridViewController+Amalto.h"

@implementation SFHybridViewController (Amalto)

- (void)viewWillAppear:(BOOL)animated
    {
        //Lower screen 20px on ios 7
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
            CGRect viewBounds = self.view.bounds;
            viewBounds.Origin.y = 20;
            viewBounds.size.height = viewBounds.size.height - 20;
            self.webView.frame = viewBounds;
        }

    [super viewWillAppear:animated];
    }

    - (void)viewDidLoad
    {

        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
            CGRect viewBounds = self.view.bounds;
            viewBounds.Origin.y = 20;
            viewBounds.size.height = viewBounds.size.height - 20;
            self.webView.frame = viewBounds;
        }
        [super viewDidLoad];
    }

@end

2 -Ajouter à AppDelegate.m importations

#import "SFHybridViewController+Amalto.h"

3 -Injecter à la fin de la méthode didFinishLaunchingWithOptions de AppDelegate

//Make the status bar appear
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {

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

4 -Ajouter à App-Info.plist la propriété

View controller-based status bar appearance avec la valeur NO

0
Bruno Grieder

Il y a plusieurs manières différentes. Une approche consiste à utiliser le fichier .plist

  • Ajoutez une nouvelle clé "Afficher l’apparence de la barre d’état basée sur le contrôleur)" et définissez la valeur sur " NO ".
  • Ajoutez une autre clé "la barre d'état est initialement masquée" et définissez la valeur sur " YES ".

Cela masquera la barre d'état tout au long du projet.

Screenshot for approach

0
Jayprakash Dubey