iOS 7 status bar retour au style par défaut iOS 6 dans l'application iPhone?

dans iOS 7 le UIStatusBar a été conçu d'une manière qu'il fusionne avec la vue comme ceci:

GUI designed by Tina Tavčar (GUI designed by Tina Tavčar )

  • C'est cool, mais il sera un peu gâcher votre point de vue lorsque vous avez quelque chose à la partie supérieure de votre point de vue, et il devient coïncidé avec la barre d'état.

  • est-il un solution simple (comme définir une propriété dans info.plist) qui peut changer la façon dont il fonctionne [ne se chevauchant pas] Retour à la façon dont il est dans iOS6?

  • je sais qu'une solution plus simple est d'avoir self.view.center.x + 20 points pour chaque contrôleur de vue unique, mais les changer va visser d'autres dimensions vers le haut (ayant un différent self.view.center.x peut causer des problèmes aux segments personnalisés, etc.) et tout à coup, il se transforme en un travail fastidieux qu'il est préférable d'éviter.

  • je serais vraiment heureux si quelqu'un peut me fournir une solution à une doublure pour cela.

P. S. je sais que je peux masquer la barre d'état en faisant des choses comme avoir

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

dans la méthode didFinishLaunchingWithOptions , mais c'est une solution, un raccourci pour éviter le problème, donc je ne considère pas que c'est une VRAIE solution.

291
demandé sur svmrajesh 2013-08-18 05:29:40

25 réponses

c'est cross-posted de un post de blog j'ai écrit , Mais voici le compte-rendu complet sur les barres d'état, barres de navigation, et les contrôleurs de vue de conteneur sur iOS 7:

  1. il n'y a aucun moyen de préserver la disposition de la barre d'état du style iOS 6. La barre d'état empiètera toujours sur votre demande sur iOS 7

  2. ne pas confondre l'apparence de la barre d'état avec la disposition de la barre d'état. Apparence (light ou par défaut) n'affecte pas la façon dont la barre d'état est présentée (frame/height/overlap). Il est important de noter que la barre d'état du système n'a plus de couleur d'arrière-plan. Lorsque L'API se réfère à UIStatusBarStyleLightContent, ils signifient texte blanc sur un fond clair. UIStatusBarStyleDefault est un texte noir sur fond clair.

  3. l'apparence de la barre de statut est contrôlée le long de l'un des deux chemins de base mutuellement exclusifs: les programmatically dans la manière traditionnelle, ou UIKit mettra à jour l'apparence pour vous basé sur quelques nouvelles propriétés de UIViewController. La dernière option est activée par défaut. Vérifiez la valeur plist de votre application pour "ViewController-Based Status Bar apparence" pour voir laquelle vous utilisez. Si vous définissez cette valeur à Oui, chaque contrôleur de vue de haut niveau dans votre application (autre qu'un contrôleur de vue de conteneur UIKit standard) a besoin de surcharger preferredStatusBarStyle, en retournant soit la valeur par défaut soit la valeur lumière de style. Si vous éditez la valeur plist à NO, alors vous pouvez gérer l'apparence de la barre d'état en utilisant les méthodes UIApplication familières.

  4. UINavigationController va modifier la hauteur de son UINavigationBar soit à 44 points ou 64 points, en fonction d'un ensemble de contraintes plutôt étranges et non documentées. Si le contrôleur D'Uinavigationcontrôle que le haut du cadre de sa vue est contigu visuellement avec le sommet de son UIWindow, alors il dessine son barre de navigation avec une hauteur de 64 points. Si le sommet de sa vue n'est pas contigu au sommet de L'UIWindow (même s'il est coupé d'un seul point), il dessine alors sa barre de navigation de manière "traditionnelle" avec une hauteur de 44 points. cette logique est exécutée par UINavigationController même si c'est plusieurs enfants à l'intérieur de la hiérarchie de contrôleur de vue de votre application. il n'y a aucun moyen d'empêcher ce comportement.

  5. si vous fournissez une image d'arrière-plan personnalisée de la barre de navigation qui ne fait que 44 points (88 pixels) de haut, et les limites de la vue de L'UINavigationController correspondent aux limites de L'UIWindow (comme discuté au #4), L'UINavigationController dessinera votre image dans le cadre (0.20.320.44), laissant 20 points d'espace noir opaque au-dessus de votre image personnalisée. Cela peut vous confondre en pensant que vous êtes un développeur intelligent qui a contourné la règle #1, mais vous vous trompez. La barre de navigation mesure toujours 64 points. L'incorporation d'un UINavigationController dans la hiérarchie des vues de style slide-to-reveal le montre très clairement.

  6. méfiez-vous de la propriété edgesforextendedlayout d'UIViewController. Ajuster edgesForExtendedLayout ne fait rien dans la plupart des cas. La seule façon dont UIKit utilise cette propriété est si vous ajoutez un contrôleur de vue à un Controller UINavigationController, alors le Controller UINavigationController utilise edgesForExtendedLayout pour déterminer si oui ou non sa vue enfant le contrôleur doit être visible sous la barre de navigation / barre d'état. Mettre edgesForExtendedLayout sur le contrôleur D'UINavigationController lui-même ne change rien au fait que le contrôleur D'UINavigationController ait ou non une barre de navigation de 44 ou 64 points de haut. Voir # 4 pour cette logique. Une logique de mise en page similaire s'applique au bas de votre vue lorsque vous utilisez une barre d'outils ou UITabBarController.

  7. Si tout ce que vous essayez de faire est d'empêcher votre enfant personnalisé vue à partir de la barre de navigation placée à l'intérieur d'un Contrôleuruinavigation, positionnez edgesForExtendedLayout sur UIRectEdgeNone (ou au moins un masque qui exclut UIRectEdgeTop). Définissez cette valeur le plus tôt possible dans le cycle de vie de votre vue-contrôleur.

  8. UINavigationController et UITabBarController essaieront également de pad les contentInsets de vues de table et de vues de collection dans sa hiérarchie de sous-vues. Il le fait d'une manière similaire la barre d'état logique de #4. Il y a une façon programmatique de prévenir cela, en définissant automatiquementadjustsscrollviewinsets à non pour vos vues de table et de collection (par défaut à YES). Cela a posé de sérieux problèmes pour Whisper et Riposte, puisque nous utilisons des réglages de content-enset pour contrôler la disposition des vues de table en réponse aux mouvements de la barre d'outils et du clavier.

  9. pour réitérer: il n'y a aucun moyen de retourner à la barre de statut de style ios 6 la logique de présentation. Afin de reproduire ce faire, vous devez déplacer tous les contrôleurs de vue de votre application dans un conteneur de vue qui est compensée par 20 points à partir du haut de l'écran, laissant volontairement noir derrière la barre d'état pour simuler l'ancienne apparence. C'est la méthode que nous avons utilisée pour riposter et chuchoter.

  10. Apple pousse très dur pour s'assurer que vous n'essayez pas de faire #9. Ils veulent que nous redessinions toutes nos applications pour barre d'état. Il y a cependant de nombreux arguments convaincants, tant pour l'expérience utilisateur que pour des raisons techniques, qui expliquent pourquoi ce n'est pas toujours une bonne idée. Vous devez faire ce qui est le mieux pour vos utilisateurs et ne pas simplement suivre la fantaisie de la plate-forme.

450
répondu jaredsinclair 2013-09-17 16:49:18

Mises à jour le 19 Sep 2013:

correction de bogues d'échelle en ajoutant self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);

typos corrigées dans la NSNotificationCenter déclaration



Mises à jour sur 12 septembre 2013:

corrigé UIViewControllerBasedStatusBarAppearance à NO

a ajouté une solution pour les applications avec rotation d'écran

a ajouté une approche pour changer la couleur de fond de la barre d'état.



il n'y a apparemment aucun moyen de rétablir la barre de statut iOS7 à la façon dont elle fonctionne dans iOS6.

Cependant, nous peut toujours écrire quelques codes et transformer la barre d'état en iOS6-like, Et c'est la façon la plus courte que je peux trouver:

  1. Set UIViewControllerBasedStatusBarAppearance à NO dans info.plist (À refuser l'utilisation de contrôleurs de vue de régler le statut de style de la barre de sorte que nous pouvons définir le statut de style de la barre à l'aide de la UIApplicationstatusBarStyle méthode.)

  2. in AppDelegate application:didFinishLaunchingWithOptions , call

    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
        [application setStatusBarStyle:UIStatusBarStyleLightContent];
        self.window.clipsToBounds =YES;
        self.window.frame =  CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);
    
        //Added on 19th Sep 2013
        self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
    }
    return YES;
    



pour:

  1. vérifiez si c'est iOS 7.

  2. définissez le contenu de la barre d'État à être blanc, par opposition à UIStatusBarStyleDefault.

  3. éviter de voir apparaître des aperçus dont les cadres s'étendent au-delà des limites visibles (pour les vues animant la vue principale à partir du haut).

  4. créer l'illusion que la barre d'État prend l'espace comme il est dans iOS 6 en déplaçant et redimensionnant le cadre de fenêtre de l'application.



pour applications avec rotation d'écran,

utiliser NSNotificationCenter pour détecter les changements d'orientation en ajoutant

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidChangeStatusBarOrientation:)
name:UIApplicationDidChangeStatusBarOrientationNotification
object:nil];

in if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) et créer une nouvelle méthode dans AppDelegate:

- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification
{
    int a = [[notification.userInfo objectForKey: UIApplicationStatusBarOrientationUserInfoKey] intValue];
    int w = [[UIScreen mainScreen] bounds].size.width;
    int h = [[UIScreen mainScreen] bounds].size.height;
    switch(a){
        case 4:
            self.window.frame =  CGRectMake(0,20,w,h);
            break;
        case 3:
            self.window.frame =  CGRectMake(-20,0,w-20,h+20);
            break;
        case 2:
            self.window.frame =  CGRectMake(0,-20,w,h);
            break;
        case 1:
           self.window.frame =  CGRectMake(20,0,w-20,h+20);
    }
}

de sorte que lorsque l'orientation change, il va déclencher un commutateur pour détecter l'orientation de l'écran de l'application (Portrait, à l'envers, paysage à gauche, ou paysage à droite) et de modifier le cadre de fenêtre de l'application respectivement pour créer l'illusion de la barre d'état iOS 6.



pour changer la couleur de fond de votre barre d'état:

ajouter

 @property (retain, nonatomic) UIWindow *background;

dans AppDelegate.h pour en faire background une propriété dans votre classe et de prévenir l'ARC de désallocation. (Vous n'avez pas à le faire si vous n'utilisez pas ARC.)

après cela, vous avez juste besoin de créer L'UIWindow dans if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) :

background = [[UIWindow alloc] initWithFrame: CGRectMake(0, 0, self.window.frame.size.width, 20)];
background.backgroundColor =[UIColor redColor];
[background setHidden:NO];

N'oubliez pas de @synthesize background; après @implementation AppDelegate !

121
répondu Archy Wilhes 魏何 2016-10-04 17:36:51

UPDATE (NEW SOLUTION)

cette mise à jour est la meilleure solution du problème de barre de navigation iOS 7.Vous pouvez définir la barre de navigation exemple de couleur: FakeNavBar.backgroundColor = [UIColor redColor];

Note: Si vous utilisez le contrôleur de Navigation par défaut, veuillez utiliser l'ancienne solution.

AppDelegate.m

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

    if(NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0)
    {
        UIView *FakeNavBar = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];
        FakeNavBar.backgroundColor = [UIColor whiteColor];

        float navBarHeight = 20.0;
        for (UIView *subView in self.window.subviews) {

            if ([subView isKindOfClass:[UIScrollView class]]) {
                subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height - navBarHeight);
            } else {
                subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height);
            }
        }
        [self.window addSubview:FakeNavBar];
    }

    return YES;

}

VIEILLE SOLUTION - SI vous utilisez le code ci-dessus s'il vous plaît ignorer Code suivant et de l'Image

c'est une ancienne version de la solution de barre de navigation iOS 7.

j'ai résolu le problème avec le code suivant. Ceci est pour ajouter une barre d'état. did finishlaunchingwithoptions

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
    UIView *addStatusBar = [[UIView alloc] init];
    addStatusBar.frame = CGRectMake(0, 0, 320, 20);
    addStatusBar.backgroundColor = [UIColor colorWithRed:0.973 green:0.973 blue:0.973 alpha:1]; //change this to match your navigation bar
    [self.window.rootViewController.view addSubview:addStatusBar];
}

et pour Interface Builder c'est pour quand vous ouvrez avec iOS 6; il commence à 0 pixels.

Note: les Deltas iOS 6/7 n'apparaissent que si vous décochez "Utiliser Autolayout" pour le contrôleur de vue dans "File Inspector" (icône la plus à gauche) dans le volet Détails.

Enter image description here

40
répondu İbrahim Özbölük 2016-10-04 19:36:25

SOLUTION:

définissez-le dans votre viewcontroller ou dans rootviewcontroller en remplaçant la méthode:

-(BOOL) prefersStatusBarHidden
    {
        return YES;
    }
26
répondu dave 2013-11-28 15:40:36

Voici une autre approche pour les projets qui font une large utilisation du Storyboard:

objectif:

but de cette approche est de recréer le même style de barre de statut dans iOS7 qu'il y avait dans iOS6 (voir le titre de la question " barre de statut iOS 7 Retour au style iOS 6?").

résumé:

pour ce faire, nous utilisons le Storyboard autant que possible en déplaçant L'interface utilisateur les éléments qui sont superposés par la barre d'état (sous iOS 7) vers le bas, tout en utilisant des deltas pour inverser la mise en page vers le bas pour iOS 6.1 ou plus tôt. L'espace supplémentaire résultant dans iOS 7 est alors occupé par un uivi avec la couleur de fond définie à une couleur de notre choix. Ce dernier peut être créé en code ou en utilisant le Storyboard (voir les ALTERNATIVES ci-dessous)

suppositions:

pour obtenir le résultat souhaité les étapes ci-dessous, il est supposé que View controller-based status bar appearance est défini à NO et que votre Status bar style est soit défini à "Transparent Black style (alpha of 0.5)" ou "Opaque black style". Les deux paramètres peuvent être trouvés/ou ajoutés sous "Info" dans les paramètres de votre projet.

SUIT:

  • Ajouter un sous-vue à L'UIWindow pour servir de votre barre de statut arrière-plan. Pour cela, ajoutez les lignes suivantes à votre AppDelegate de l' application: didFinishLaunchingWithOptions: après makeKeyAndVisible

    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
        UIView *statusBarBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, yourAppsUIWindow.frame.size.width, 20)];
        statusBarBackgroundView.backgroundColor = [UIColor blackColor];
        [yourAppsUIWindow addSubview:statusBarBackgroundView];
    }
    
  • puisque vous avez ajouté programmatiquement un arrière-plan pour iOS 7 seulement, vous devrez ajuster la disposition de vos éléments UI qui sont superposés par la barre d'état en conséquence tout en conservant leur layout pour iOS6. Pour ce faire, faites ce qui suit:

    • assurez-vous que Use Autolayout n'est pas vérifié pour votre Storyboard (c'est parce que sinon "iOS 6/7 Deltas" n'est pas montré dans la Taille de l'Inspecteur). Pour ce faire:
      • sélectionnez votre fichier Storyboard
      • afficher les Utilitaires
      • sélectionner" Afficher L'inspecteur de fichiers "
      • Sous "Interface Builder Document" décocher la case "Utiliser la mise en forme automatique"
    • optionnellement, pour vous aider à surveiller les changements de mise en page pour les iOS 7 et 6 pendant que vous les appliquez, sélectionnez le "Assistant Editor", Sélectionnez "Preview" et " iOS 6.1 ou une version antérieure": enter image description here enter image description here
    • Maintenant, sélectionnez L'élément UI que vous voulez ajuster pour qu'il ne soit plus chevauché par la barre d'état
    • sélectionner "Afficher la taille Inspecteur" dans la colonne "services publics
    • repositionnez votre élément UI le long de l'axe des Y du même montant que la hauteur de la bg statusbar: enter image description here
    • et changer la valeur des Deltas iOS6 / 7 pour Y par le même montant négatif que la hauteur statusbar bg (Notez le changement dans l'aperçu iOS 6 Si vous l'utilisez): enter image description here

ALTERNATIVES:

pour ajouter encore moins de code dans storyboard-les projets lourds et d'avoir le statusbar arrière-plan autorotate, au lieu d'ajouter programmatically un arrière-plan pour votre statusbar, vous pourriez ajouter une vue colorée à chaque vue contrôleur qui se trouve au sommet de la vue principale du viewcontroller. Vous changeriez alors la hauteur delta de cette nouvelle vue à la même valeur négative que la hauteur de votre vue (pour la faire disparaître sous iOS 6).

l'inconvénient de cette alternative (bien que peut-être négligeable compte tenu de la compatibilité autorotate) est le fait que cette vue supplémentaire n'est pas immédiatement visible si vous regardez votre Storyboard pour iOS 6. Vous ne le sauriez que si vous aviez regardez le "plan du document" du Storyboard.

17
répondu sts2055 2016-10-04 15:16:29

si vous ne voulez pas que vos contrôleurs de vue soient chevauchés par la barre d'état (et les barres de navigation), décocher la case" étendre les bords sous les barres supérieures "dans Interface Builder dans Xcode 5.

Uncheck the Extend Edges Under Top Bars

12
répondu nvrtd frst 2013-09-22 13:28:43

Apple a publié Technique Q&A QA1797: la Prévention de la Barre d'État de la couverture de Votre point de Vue . Il fonctionne très bien pour les versions iOS 6 et iOS 7.

11
répondu Igor 2017-12-16 15:54:40

j'ai vu beaucoup beaucoup beaucoup beaucoup beaucoup et beaucoup de tutoriels pour résoudre ce problème. Mais aucun d'entre eux travaille! Voici ma solution, et ça marche pour moi:

if( [[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f ) {
    float statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
    for( UIView *v in [self.view subviews] ) {
        CGRect rect = v.frame;
        rect.origin.y += statusBarHeight;
        v.frame = rect;
    }
}

la logique est simple. Je change tous les points de vue des enfants sur le moi.vue avec 20 pixels. C'est tout. Ensuite, la capture d'écran s'affichera comme iOS 6 l'a fait. Je déteste la barre de statut iOS7! ~"~

8
répondu firestoke 2013-09-30 21:27:38

une petite alternative à la réponse D'Archy Holt, un peu plus simple:

A. Mettez UIViewControllerBasedStatusBarAppearance à NO dans info.plist

B. Dans AppDelegate 's application:didFinishLaunchingWithOptions: , appelez:

if ([[UIDevice currentDevice].systemVersion floatValue] < 7)
{
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
}
else
{
    // handling statusBar (iOS7)
    application.statusBarStyle = UIStatusBarStyleLightContent;
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
    self.window.clipsToBounds = YES;

    // handling screen rotations for statusBar (iOS7)
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidChangeStatusBarOrientationNotification:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
}

et ajouter la méthode:

- (void)applicationDidChangeStatusBarOrientationNotification:(NSNotification *)notification
{
    // handling statusBar (iOS7)
    self.window.frame = [UIScreen mainScreen].applicationFrame;
}

vous pouvez également considérer le sous-classement UIWindow pour traiter UIApplicationDidChangeStatusBarOrientationNotification lui-même.

6
répondu Cœur 2017-12-16 15:52:45

j'ai utilisé ceci dans tous mes contrôleurs de vue, c'est simple. Ajoutez cette ligne dans toutes vos méthodes de viewDidLoad:

- (void)viewDidLoad{
    //add this 2 lines:
    if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

    [super viewDidLoad];
}
5
répondu IgniteCoders 2013-10-22 15:40:58

essayez cette méthode simple....

Étape 1 : pour changer en simple viewController

[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque];

Étape 2 : changer dans l'application entière

info.plist
      ----> Status Bar Style
                  --->UIStatusBarStyle to UIStatusBarStyleBlackOpaque

Étape 3 : ajouter également ceci dans chaque viewWillAppear pour ajuster statusbar hauteur pour iOS7

    [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 7) {
        CGRect frame = [UIScreen mainScreen].bounds;
        frame.origin.y+=20.0;
        frame.size.height-= 20.0;
        self.view.frame = frame;
        [self.view layoutIfNeeded];
    }
4
répondu svmrajesh 2014-05-25 06:11:48

il y a une option dans le constructeur D'Interface qui appelle la propriété iOS 6/7 Delta qui vise à résoudre le problème de décalage.

regardez-le dans Stack Overflow question Interface Builder: à quoi servent les Deltas Uiview's Layout iOS 6/7? .

3
répondu Tony Fung Choi Fung 2017-05-23 10:31:36

j'ai atteint la barre de statut comme iOS 6 dans iOS 7.

Set UIViewControllerBasedStatusBarAppearance PAS en info.plist

Pase ce code dans - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions method

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    [application setStatusBarStyle:UIStatusBarStyleLightContent];
    self.window.clipsToBounds =YES;
    self.window.frame =  CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height);

    //Added on 19th Sep 2013
    NSLog(@"%f",self.window.frame.size.height);
    self.window.bounds = CGRectMake(0,0, self.window.frame.size.width, self.window.frame.size.height);
}

il peut réduire toutes vos vues de 20 pixels.Pour plus venir que l'utilisation du code suivant dans -(void)viewDidAppear:(BOOL)animated méthode

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    CGRect frame=self.view.frame;
    if (frame.size.height==[[NSUserDefaults standardUserDefaults] floatForKey:@"windowHeight"])
    {
        frame.size.height-=20;
    }
    self.view.frame=frame;
}

vous devez définir windowHeight Userdefaults value après attribution de fenêtre dans didFinishLauncing Méthode comme

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[[NSUserDefaults standardUserDefaults] setFloat:self.window.frame.size.height forKey:@"windowHeight"];
3
répondu Desert Rose 2013-10-20 13:15:26

si vous utilisez Interface builder, essayez ceci:

dans votre fichier xib:

1) Sélectionnez la vue principale, définissez la couleur de fond au noir (ou quelle que soit la couleur que vous voulez que la barre d'État soit

2) Assurez-vous que l'arrière-plan est un sous-vue autonome positionné comme un enfant de niveau supérieur de la vue du contrôleur.

Déplacez votre parcours pour devenir un enfant direct de la vue du contrôleur. Vérifiez le panneau d'autosizing pour être sûr que vous avez verrouillé tous les bords de cadre, activé les deux axes de flexibilité, et si C'est un UIImageView, définir le mode de contenu à L'échelle de remplissage. Par programmation, ce qui se traduit par contentMode ensemble de UIViewContentModeScaleToFill et a sa taille automatique de masque (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight).

3) Déplacez maintenant tout ce qui est verrouillé vers le haut - baisse de 20 pts et mets un iOS 6/7 delta Y à -20.

Tous les enfants de niveau supérieur qui sont verrouillés sur le cadre supérieur dans le panneau d'autosizing doivent être déplacés vers le bas de 20pts et avoir leur iOS 6/7 delta y réglé à -20. (Cmd sélectionner tous ces, et cliquez sur flèche bas 20 fois - y a-t-il une meilleure façon quelqu'un?)

4) régler la hauteur delta iOS 6/7 de tous les articles ci-dessus qui avaient une hauteur flexible. L'un des éléments qui ont été verrouillés sur le haut et le bas du cadre et avait la hauteur flexible permise dans le panneau d'autosizing doit également avoir leur iOS 6/7 delta hauteur réglée à 20. Cela inclut la vue de fond mentionnée ci-dessus. Cela peut sembler contre-intuitif, mais en raison de l'ordre dans lequel ils sont appliqués, il est nécessaire. La hauteur du cadre est réglée en premier (basé sur le dispositif), puis les deltas sont appliqués, et enfin les masques d'autosizing sont appliqués basés sur les positions offset de tous les cadres de l'enfant - pensez-le à travers pour un peu, ça aura du sens.

5) Enfin, les articles qui étaient verrouillés sur le cadre inférieur, mais pas sur le cadre supérieur, n'ont pas besoin de deltas.

qui vous donnera la barre de statut identique dans iOS7 et iOS6.

par contre, si vous voulez style iOS7 tout en maintenant la compatibilité iOS6, alors réglez les valeurs de hauteur delta Y / delta à 0 pour la vue de fond.

Pour voir plus de iOS7 migration info lire l'article complet: http://uncompiled.blogspot.com/2013/09/legacy-compatible-offsets-in-ios7.html

2
répondu thebman 2013-09-23 00:30:31

ma solution a été d'ajouter un UIView avec une hauteur de 20 points sur le dessus de la fenêtre lorsque sur iOS 7. Puis j'ai créé une méthode dans ma classe AppDelegate pour afficher/cacher le fond de la barre d'État "solid". Dans application:didFinishLaunchingWithOptions: :

// ...

// Add a status bar background
self.statusBarBackground = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, 20.0f)];
self.statusBarBackground.backgroundColor = [UIColor blackColor];
self.statusBarBackground.alpha = 0.0;
self.statusBarBackground.userInteractionEnabled = NO;
self.statusBarBackground.layer.zPosition = 999; // Position its layer over all other views
[self.window addSubview:self.statusBarBackground];

// ...
return YES;

puis j'ai créé une méthode pour effacer le fond de la barre d'état noire:

- (void) showSolidStatusBar:(BOOL) solidStatusBar
{
    [UIView animateWithDuration:0.3f animations:^{
        if(solidStatusBar)
        {
            [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
            self.statusBarBackground.alpha = 1.0f;
        }
        else
        {
            [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
            self.statusBarBackground.alpha = 0.0f;
        }
    }];
}

Je N'ai plus qu'à appeler [appDelegate showSolidStatusBar:YES] au besoin.

2
répondu Alexandre OS 2013-09-27 21:12:56

cela peut être un problème accablant si vous utilisez la mise en page automatique parce que vous ne pouvez plus manipuler directement les cadres. Il existe une solution simple sans trop de travail.

j'ai fini par écrire une méthode utilitaire dans une classe utilitaire et l'ai appelée de tous les contrôleurs de vue viewDidLayoutSubviews méthode.

+ (void)addStatusBarIfiOS7:(UIViewController *)vc
    {
        if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
            CGRect viewFrame = vc.view.frame;
            if(viewFrame.origin.y == 20) {
                //If the view's y origin is already 20 then don't move it down.
                return;
            }
            viewFrame.origin.y+=20.0;
            viewFrame.size.height-= 20.0;
            vc.view.frame = viewFrame;
            [vc.view layoutIfNeeded];
        }
    }

outrepasse votre méthode viewDidLayoutSubviews dans le contrôleur de vue, où vous voulez la barre d'état. Il vous permettra de surmonter le fardeau de Mise en page automatique.

- (void)viewDidLayoutSubviews
{
    [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
    [super viewDidLayoutSubviews];
    [MyUtilityClass addStatusBarIfiOS7:self];
}
2
répondu Selvin 2014-04-15 17:31:30

la meilleure façon de le faire est d'installer un ancien SDK à votre plus récent Xcode.

comment installer un ancien SDK sur le plus récent Xcode?

  1. U can get the iOS 6.1 SDK from http://www.4shared.com/zip/NlPgsxz6/iPhoneOS61sdk.html ou télécharger un ancien Xcode et geting le SDK à partir de son contenu

  2. décompresser et coller ce dossier à / Applications / Xcode.app/Contents/Développeur/plates-formes/iPhoneOS.plate-forme/développeur / SDKs

  3. redémarrez le xcode.

  4. U peut maintenant sélectionner un ancien SDK sur les paramètres de construction de votre projet

J'espère que ça vous aidera. Il a travaillé pour moi =)

1
répondu marcelosalloum 2013-10-03 19:06:25

comme utiliser presentViewController:animated:completion: a fait foirer le window.rootViewController.view , j'ai dû trouver une approche différente à cette question. J'ai finalement réussi à le faire fonctionner avec les modales et les rotations en subclassant L'uivi de mon rootViewController.

.h

@interface RootView : UIView

@end

.m

@implementation RootView

-(void)setFrame:(CGRect)frame
{
    if (self.superview && self.superview != self.window)
    {
        frame = self.superview.bounds;
        frame.origin.y += 20.f;
        frame.size.height -= 20.f;
    }
    else
    {
        frame = [UIScreen mainScreen].applicationFrame;
    }

    [super setFrame:frame];
}

- (void)layoutSubviews
{
    self.frame = self.frame;

    [super layoutSubviews];
}

@end

vous avez maintenant une bonne solution de contournement pour iOS7 animations.

1
répondu Cœur 2013-10-08 16:47:14

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

tout d'Abord-> Aller à votre "151910920 de Fichier" et ajouter la Barre d'État Style->Transparent Noir Style(Alpha de 0.5)

maintenant, voilà: -

ajouter ce code dans votre demande.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;
   }
1
répondu Vizllx 2014-02-26 06:39:50

ma solution très simple (en supposant que vous n'avez que l'orientation verticale supportée) est de redéfinir les limites de la fenêtre d'application pour les versions iOS en dessous de 7, dans la méthode App delegate didfinishlaunchwithoptions:

CGRect screenBounds = [[UIScreen mainScreen] bounds];
if ([HMService getIOSVersion] < 7) {
    // handling statusBar (iOS6) by leaving top 20px for statusbar.
    screenBounds.origin.y = 20;
    self.window = [[UIWindow alloc] initWithFrame:screenBounds];
}
else {
    self.window = [[UIWindow alloc] initWithFrame:screenBounds];
}
0
répondu jki 2013-09-19 14:55:07

vous pouvez cacher la barre d'état tous ensemble. Votre application sera donc en plein écran. Je pense que c'est le meilleur que vous obtiendrez.

UIStatusBarStyleNone ou défini dans les paramètres de la cible.

0
répondu Christopher Rex 2013-09-22 13:23:41

Étapes Pour Masquer la barre d'état dans iOS 7:

1.Accédez à votre application info.dossier plist.

2.Et Set, afficher la barre d'état basée sur le contrôleur apparence: booléen NO

J'espère avoir résolu le problème de la barre de statut.....

0
répondu chandrika 2014-01-30 11:43:30

pour continuer à travailler avec setStatusBarHidden: j'utilise cette catégorie:

@interface UIApplication (StatusBar)

-(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden;

@end

@implementation UIApplication (StatusBar)

-(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden{
    if (!IOS7) {
        [self setStatusBarHidden:statusBarHidden];
        return;
     }

    if ([self isStatusBarHidden] == statusBarHidden) {
        return;
    }

    [self setStatusBarHidden:statusBarHidden];
    [self keyWindow].clipsToBounds = YES;
    CGFloat offset = statusBarHidden ? 0 : 20;
    [self keyWindow].frame =  CGRectMake(0,offset,[self keyWindow].frame.size.width,[self keyWindow].frame.size.height-offset);
    [self keyWindow].bounds = CGRectMake(0, offset, [self keyWindow].frame.size.width,[self keyWindow].frame.size.height);
}

@end
0
répondu Tomer Even 2014-02-08 21:25:46

j'ai trouvé ici est la meilleure alternative et la solution pour ce problème de barre de navigation dans iOS7!!

http://www.appcoda.com/customize-navigation-status-bar-ios-7 /

j'espère qu'il va effacer toutes nos questions et inquiétudes.

0
répondu simbesi.com 2014-03-26 06:30:30

cela pourrait être trop tard pour partager, mais j'ai quelque chose à contribuer qui pourrait aider quelqu'un, j'essayais de sous-classe le UINavigationBar et je voulais le faire ressembler à ios 6 avec barre de statut noir et texte de barre de statut en blanc.

voici ce que j'ai trouvé de travail pour que

        self.navigationController?.navigationBar.clipsToBounds = true
        self.navigationController?.navigationBar.translucent = false
        self.navigationController?.navigationBar.barStyle = .Black
        self.navigationController?.navigationBar.barTintColor = UIColor.whiteColor()

il a fait mon fond de barre de statut noir, texte de barre de statut blanc et la couleur de barre de navigation blanc.

iOS 9.3, XCode 7.3.1

0
répondu channi 2016-05-31 11:16:30