36 votes

Déplacement de la barre d'état dans iOS 7

Le problème que je me pose est: est-ce

Je veux mettre en œuvre un iOS 7 app avec un design agréable et gauche/droite du menu qui s'affiche après l'écran principal d'animer lui-même vers la droite/gauche. Je fais cela avec [UIView animateWithDuration...] code, mais ce n'est pas vraiment important. Ce que je veux atteindre est le même effet que la Boîte aux lettres iOS 7 app a: pour déplacer la barre d'état à l'écart (à droite/à gauche) avec la vue principale

Image pour une meilleure explication:

Mailbox app with status bar moved to the side

Ce que je n'ai trouvé est cet article sur la question, avec un certain code de travail en utilisant des Api Privées, que je voudrais ne pas l'utiliser, car je veux que mon application soit acceptée sur l'App Store.

J'aimerais obtenir le même effet ('légalement'). Quelqu'un sait comment?

Merci!

48voto

Simon Holroyd Points 621

L'essentiel, c'est d'utiliser cette méthode introduit dans l'iOS 7:

https://developer.apple.com/library/ios/documentation/uikit/reference/UIScreen_Class/Reference/UIScreen.html#//apple_ref/occ/instm/UIScreen/snapshotViewAfterScreenUpdates:

Avec ce que vous obtenez une UIView contenant une capture d'écran qui inclut la barre d'état. Une fois que vous avez, c'est juste une question de cacher votre vue actuelle puis en poussant la capture d'écran de la vue autour de.

J'ai posté une preuve de concept ici: https://github.com/simonholroyd/StatusBarTest

REMARQUE je n'ai pas soumis de code qui fait cela par le biais d'Apple processus d'examen, mais ce n'est pas une API privée de la méthode.

7voto

signal Points 64

J'utilise cette méthode pour déplacer statuebar avec un curseur. Dans une application, il y a deux fenêtres, une fenêtre normale, un autre statuBarWindow, j'obtiens statuBarView qui est superView statuBarWindows, et le déplace avec un curseur.

 - (UIView *)statuBarView
{
    NSString *key = [[NSString alloc] initWithData:[NSData dataWithBytes:(unsigned char []){0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x61, 0x72} length:9] encoding:NSASCIIStringEncoding];
    id object = [UIApplication sharedApplication];
    UIView *statusBar = nil;
    if ([object respondsToSelector:NSSelectorFromString(key)]) {
        statusBar = [object valueForKey:key];
    }
    return statusBar;
}
 

7voto

Gyfis Points 435

Ainsi, après la première poussée par M. Simon Holroyd et quelques recherches, j'ai trouvé la solution de la façon d'atteindre cet "effet" de la fonctionnalité. C'est le code:

statusbarView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];

EDIT: monsieur pcholberg correctement a souligné que l'ancien code ne fonctionne pas sur le réel de l'appareil, uniquement sur le Simulateur iOS, donc j'ai édité, par sa recommandation

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
    UIView *screenShot = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:NO];
    [statusbarView addSubview:screenShot];
    [statusbarView setClipsToBounds:YES];
    [self.view addSubview:statusbarView];

    [self setPrefersStatusBarHidden:YES];
    [self prefersStatusBarHidden];
    [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
}

...

- (BOOL)prefersStatusBarHidden
{
    return prefersStatusBarHidden;
}

...


Donc, la première partie crée contexte, utilise la méthode Simon mentionné, attire la vue avec la barre de statut, et l'enregistre comme un UIImage

La deuxième partie ajoute que l'instantané UIView de mon viewController de l' UIView

Et la troisième partie définit mon bool pour la barre d'état pour OUI (pour une utilisation plus facile dans la méthode ci-dessus), et les appels de méthodes pour redessiner il

Cela définit alors la UIView comme non-fonctionnelle de la barre d'état à sa place et se cache celui d'origine, donc il n'y a pas de double-rendu. Alors je peux utiliser ce point de vue dans mon [UIView animateWithDuration... méthode

Et quand je reviens, j'utilise ce code dans le gestionnaire d'achèvement du bloc d'animation:

[statusbarView removeFromSuperview];

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{

    [self setPrefersStatusBarHidden:NO];
    [self prefersStatusBarHidden];
    [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];

}

Et voilá! Cela fonctionne comme le décrit effet dans ma question.

Espérons que cela aide quelqu'un!

3voto

simonbs Points 2875

Je viens de créer BSPanViewController, ce qui rend extrêmement facile la réalisation de cet effet. Le contrôle et les instructions d'utilisation sont disponibles sur GitHub .

La mise en œuvre est la même que celle expliquée par Simon Holroyd .

0voto

rowwingman Points 2823

Voir ce projet. Je ne sais pas utiliser leur API privée ou non, mais dans leur exemple, vous pouvez voir que statusBar se déplace avec le contrôleur https://github.com/monospacecollective/MSDynamicsDrawerViewController.

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