294 votes

La barre d'état iOS 7 revient à iOS 6 par défaut dans l'application iPhone?

Dans iOS 7 UIStatusBar a été conçu de façon qu'il se confond avec le point de vue comme ceci:

GUI designed by Tina Tavčar (GUI conçu par Tina Tavčar)

  • Il 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 une solution simple (comme la définition d'une propriété en info.plist) qui peut changer la façon dont il fonctionne [pas de chevauchement] revenir à la façon dont il est dans iOS6?

  • Je sais que plus simple solution consiste à avoir self.view.center.x + 20 points pour chaque vue-contrôleur, mais en changeant leur sera à vis d'autres dimensions (en ayant une différente self.view.center.x peut causer des problèmes à la coutume enchaîne, etc.) et tout à coup, il se transforme en un travail fastidieux qui est le mieux pour être évitée.

  • Je vais être vraiment heureux si quelqu'un peut me fournir un one-liner solution 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];

En didFinishLaunchingWithOptions méthode, mais c'est une solution de contournement, un raccourci en évitant le problème, donc je ne considère pas qu'une solution réelle.

448voto

jaredsinclair Points 6858

C'est cross-posté depuis un post de blog que j'ai écrit, mais voici le récapitulatif complet sur l'état des bars, des barres de navigation et des conteneur affichage des contrôleurs sur iOS 7:

  1. Il n'y a aucun moyen de préserver l'iOS 6 style de la barre d'état de mise en page. La barre d'état est toujours recouvrir votre application sur iOS 7

  2. Ne pas confondre le statut apparence de la barre de statut la barre de mise en page. L'apparition de la lumière (ou par défaut) n'a pas d'incidence sur la barre d'état est posé sur le sol (image/hauteur/chevauchement). Il est important de noter que bien que le système de barre d'état n'a plus aucune couleur d'arrière-plan. Lorsque l'API renvoie à UIStatusBarStyleLightContent, il s'agit d'un texte blanc sur un fond clair. UIStatusBarStyleDefault est un texte noir sur un fond clair.

  3. Barre d'état de l'apparence est contrôlée le long de l'un des deux mutuellement exclusive des chemins: vous pouvez soit définir par programmation à la manière traditionnelle, ou UIKit permettra de mettre à jour l'apparence pour vous en fonction de certaines propriétés nouvelles de UIViewController. La dernière option est activée par défaut. Vérifiez votre application plist de la valeur pour "ViewController d'État Basé sur l'Apparence de la Barre" pour voir laquelle des deux vous êtes en utilisant. Si vous définissez cette valeur sur OUI, chaque niveau supérieur-vue-contrôleur dans votre application (autre qu'une norme UIKit conteneur view controller) doit remplacer preferredStatusBarStyle, retour par défaut ou la lumière de style. Si vous modifiez le fichier plist de la valeur ou PAS, vous pouvez gérer l'apparence de la barre de statut en utilisant le familier UIApplication méthodes.

  4. UINavigationController va modifier la hauteur de ses UINavigationBar soit 44 points ou 64 points, selon une étrange et sans-papiers ensemble de contraintes. Si le UINavigationController détecte que le haut de son point de vue, l'image est visuellement contiguë avec ses UIWindow du haut, puis il tire de sa barre de navigation avec une hauteur de 64 points. Si sa vue du dessus n'est pas contigu à la UIWindow top (même si par un seul point), puis il tire de sa barre de navigation dans la manière "traditionnelle", avec une hauteur de 44 points. Cette logique est effectuée par UINavigationController même si c'est plusieurs enfants à l'intérieur de la vue-contrôleur de la hiérarchie de votre application. Il n'existe aucun moyen d'éviter ce problème.

  5. Si vous fournissez une barre de navigation personnalisée image de fond qui est que de 44 points (88 pixels) de hauteur, et l'UINavigationController de vue les limites correspond à la UIWindow de limites (voir n ° 4), la UINavigationController va attirer votre image dans l'image (0,20,320,44), ne laissant que 20 points noirs opaques de l'espace au-dessus de votre image personnalisée. Cela peut vous tromper en pensant que vous êtes un habile développeur qui a contourné la règle #1, mais vous vous trompez. La barre de navigation est encore 64 points de haut. L'incorporation d'un UINavigationController dans une diapositive à révéler le style de vue de la hiérarchie fait cela parfaitement clair.

  6. Méfiez-vous de la confusion-nommé edgesForExtendedLayout propriété de UIViewController. Réglage de edgesForExtendedLayout ne fait rien dans la plupart des cas. La seule façon de UIKit utilise cette propriété est si vous ajoutez une-vue-contrôleur à un UINavigationController, puis le UINavigationController utilise edgesForExtendedLayout pour déterminer si oui ou non son enfant-vue-contrôleur doit être visible en dessous de la barre de navigation et la barre de status de la zone. Réglage edgesForExtendedLayout sur le UINavigationController lui-même ne modifie en rien de savoir si ou non le UINavigationController a un 44 ou 64 point haut de la barre de navigation de la zone. Voir #4 pour que la logique. Mise en page similaire logique s'applique à la partie inférieure de votre point de vue lors de l'utilisation d'une barre d'outils ou UITabBarController.

  7. Si tout ce que vous essayez de faire est d'empêcher votre enfant personnalisé-vue-contrôleur de underlapping la barre de navigation à l'intérieur d'un UINavigationController, puis définissez edgesForExtendedLayout à 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 vais aussi essayer de compléter les contentInsets de vues de table et les vues de la collection dans son sous-vue de la hiérarchie. Il le fait d'une manière similaire à la barre d'état logique de #4. Il y a un moyen via un programme de prévention de la ce, par la mise en automaticallyAdjustsScrollViewInsets PAS pour votre table de points de vue et les vues de la collection (la valeur par défaut est OUI). Cela pose de sérieux problèmes de Murmure et de Riposte, puisque nous utilisons contentInset ajustements pour contrôler la mise en page de la table des points de vue en réponse à la barre d'outils de clavier et de mouvements.

  9. Je le répète: il n'y a aucun moyen pour revenir à iOS 6 style de la barre d'état de 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 fini par utiliser dans la Riposte et de Murmurer.

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

123voto

0a -archy Points 4224

Mises à jour le 19 Sep 2013:

fixe de mise à l'échelle des bugs par l'ajout d' self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);

corrigé les fautes de frappe dans l' NSNotificationCenter déclaration


Les mises à jour sur 12 septembre 2013:

corrigé UIViewControllerBasedStatusBarAppearance de NO

ajout d'une solution pour les applications avec la rotation de l'écran

ajout d'une approche pour changer la couleur d'arrière-plan de la barre d'état.


Il n'y a, apparemment, pas moyen de revenir à l'iOS7 barre d'état de revenir à la façon dont il fonctionne dans iOS6.

Cependant, nous pouvons toujours écrire des codes et activez la barre d'état en iOS6, et c'est le chemin le plus court que je peux venir avec:

  1. Ensemble UIViewControllerBasedStatusBarAppearance de NO en 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. Dans AppDelegate de l' application:didFinishLaunchingWithOptions, appel

    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-20);
    
        //Added on 19th Sep 2013
        self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
    }
    return YES;
    


dans le but de:

  1. Vérifier si c'est iOS 7.

  2. Set barre d'état du contenu de blanc, par opposition à UIStatusBarStyleDefault.

  3. Éviter de sous-vues dont les images s'étendre au-delà du visible limites d'apparaître (pour les vues de l'animation dans la fenêtre principale à partir du haut).

  4. Créer l'illusion que la barre d'état prend de la place, comme la façon dont il est en iOS 6 par le déplacement et le redimensionnement de la fenêtre de l'application du cadre.


Pour les applications avec la rotation de l'écran

utilisation NSNotificationCenter pour détecter les changements d'orientation par l'ajout d'

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

en if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) et de 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 les changements d'orientation, il sera le déclencheur d'une instruction switch pour détecter application de l'orientation de l'écran (Portrait, la tête en Bas, le Paysage à Gauche, ou le Paysage à Droite) et de modifier l'application du cadre de la fenêtre, respectivement, afin de créer l'iOS 6 barre d'état de l'illusion.


Pour modifier la couleur d'arrière-plan de votre barre d'état:

Ajouter

 @property (retain, nonatomic) UIWindow *background;

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

Après que vous avez juste besoin de créer le UIWindow en if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7):

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

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

41voto

MISE À JOUR(NOUVELLE SOLUTION)

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

Remarque : Si vous utilisez par défaut de la manette de Navigation, veuillez utiliser ancienne solution.

AppDelegate.m

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

    if([[[UIDevice currentDevice] systemVersion] floatValue] >= 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

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

J'ai résolu le problème avec le code suivant. C'est pour l'ajout d'une barre d'état. didFinishLaunchingWithOptions

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; c'est en commençant à 0 pixels.

Remarque: iOS 6/7 Deltas n'apparaissent que si vous décochez la case "Utiliser la mise en forme automatique" pour la Vue-Contrôleur dans le Fichier "Inspecteur" (le plus à gauche de l'icône) dans le volet de détails.

Enter image description here

26voto

dave Points 266

SOLUTION :

Placez-le dans votre viewcontroller ou RootViewController exchangeAddSubViewFor en substituant la méthode :

17voto

sts2055 Points 371

Ici une autre approche pour les projets qui font une utilisation intensive de la table de montage séquentiel:

OBJECTIF:

L'objectif de cette approche est de recréer la même barre d'état style iOS7 comme il y avait dans iOS6 (voir la question titre "iOS 7 Barre d'État de Revenir à iOS 6 style?").

RÉSUMÉ:

Pour cela, nous utilisons la table de montage séquentiel, autant que possible, par le déplacement des éléments de l'INTERFACE utilisateur qui sont recouvertes par la barre d'état (sous iOS 7) vers le bas, tout en utilisant les deltas de revenir à la baisse changement de présentation pour iOS 6.1 ou une version antérieure. L'résultant de l'espace supplémentaire dans iOS 7 est alors occupé par une UIView avec le backgroundColor définir une couleur de notre choix. Ce dernier peut être créé dans le code ou à l'aide de la table de montage séquentiel (voir les ALTERNATIVES ci-dessous)

HYPOTHÈSES:

Pour obtenir le résultat souhaité en suivant les étapes ci-dessous, il est supposé que l' View controller-based status bar appearance est PAS activé et que votre Status bar style est soit "Transparent noir style (alpha de 0.5)" ou "Opaque noir de style". Les deux paramètres peuvent être trouvés/ou ajoutés sous "Info" dans les paramètres de votre projet.

ÉTAPES:

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

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        UIView *statusBarBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, yourAppsUIWindow.frame.size.width, 20)];
        statusBarBackgroundView.backgroundColor = [UIColor blackColor];
        [yourAppsUIWindow addSubview:statusBarBackgroundView];
    }
    
  • Depuis vous par programme ajout d'un arrière-plan pour iOS 7 UNIQUEMENT, vous devrez ajuster la mise en page de vos éléments d'INTERFACE utilisateur qui sont recouvertes par la barre d'état en conséquence, tout en conservant leur mise en page pour iOS6. Pour ce faire, effectuez les opérations suivantes:

    • S'assurer que Use Autolayout n'est pas cochée pour votre Storyboard (c'est parce que sinon "iOS 6/7 Deltas" ne figure pas dans la Taille de l'Inspecteur). Pour ce faire:
      • sélectionnez votre fichier Storyboard
      • afficher les Utilitaires
      • sélectionnez "Afficher l'Inspecteur de Fichiers"
      • Sous "Interface Builder Document" décocher la case "Utiliser la mise en forme automatique"
    • En option, pour vous aider à surveiller les modifications de mise en page pour iOS 7 ET 6, comme vous les appliquer, sélectionnez le "Rédacteur en chef Adjoint", sélectionnez "Aperçu" et "iOS 6.1 ou une version antérieure": enter image description hereenter image description here
    • Maintenant, sélectionnez l'élément de l'INTERFACE utilisateur que vous souhaitez ajuster de sorte qu'il n'est pas recouverte par la barre d'état plus
    • Sélectionnez "Afficher la Taille de l'Inspecteur" dans la colonne Utilities
    • Repositionner votre élément de l'INTERFACE utilisateur, le long de l'axe des Y du même montant que la barre d'état bg hauteur: enter image description here
    • Et changer le iOS6/7 Deltas valeur de Y par le même montant NÉGATIF comme la barre d'état bg hauteur (Notez le changement dans l'iOS 6 aperçu si vous l'utilisez): enter image description here

ALTERNATIVES:

Pour ajouter encore moins de code dans storyboard-les gros projets et d'avoir la barre de pivoter automatiquement l'arrière-plan, au lieu de les ajouter par programme d'arrière-plan pour votre état, vous pourriez ajouter une vue colorée de chaque vue-contrôleur qui se trouve tout en haut de dit viewcontroller de la vue principale. Vous pouvez alors modifier la hauteur du delta de ce nouveau point de vue pour le même montant négatif que votre point de vue en hauteur (pour le faire disparaître sous iOS 6).

L'inconvénient de cette solution (bien que peut-être négligeable compte tenu de la rotation automatique de compatibilité) est le fait que cette vue n'est pas immédiatement visible si vous êtes à la visualisation de votre Storyboard pour iOS 6. Vous ne le savez qu'il est là si vous avez eu un coup d'oeil à la "structure du Document" de la table de montage séquentiel.

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