UIStatusBar comme dans Facebook nouvelle application iOS7

J'ai une application avec menu barre latérale, un peu comme le menu barre latérale Facebook. J'utilise cette class appelée SWRevealViewController et ça marche très bien. Depuis iOS7 est sorti, je ne peux pas comprendre comment ajuster mon statut et barre de navigation pour être comme dans l'application Facebook.

Comme vous pouvez le voir, dans l'application Facebook, lorsque l'user fait glisser l'écran et ouvre le menu, la barre d'état passe de la couleur bleue de la barre de navigation au noir avec l'animation Fondu. Dans mon application, l'user glisse sur l'écran pour ouvrir le menu et la barre d'état avec la couleur bleue (qui est bleue à cause de cette vue NavigationBar) ne disparaîtra pas et changera la couleur en noir.

barre de navigation de l'application facebook

ma barre de navigation de l'application

En outre, un autre problème que je rencontre, je ne peux tout simplement pas changer la couleur du text StatusBar en blanc. J'ai tout essayé, chaque morceau de code sur Internet, lire toute la documentation d'Apple, mais je n'arrivais toujours pas à changer la couleur.

J'ai aussi utilisé ce code:

 - (UIStatusBarAnimation)preferredStatusBarUpdateAnimation { return UIStatusBarAnimationFade; } - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } - (BOOL)prefersStatusBarHidden { return NO; } 

Merci d'avance.

============================================= ===================

MISE À JOUR : La solution à ce problème, comme dans la réponse de @yoeriboven, est de placer 2 vues sur le SWRevealViewController avec la couleur noire et la couleur bleue et d'animer les deux, c'est une excellente solution et tout a bien fonctionné.

Ainsi, en créant le revealController j'ai créé 2 UIViews vierges et les ai ajoutés, un bleu et un noir. L'un d'eux, le noir, je gardais caché pour l'instant.

 self.revealController = [[SWRevealViewController alloc] initWithRearViewController:nil frontViewController:self.frontViewController]; self.revealController.delegate = self; self.appDelegate.window.rootViewController = self.revealController; self.statusBarBlack = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.appDelegate.window.frame.size.width, 20)]; [self.statusBarBlack setBackgroundColor:[UIColor blackColor]]; self.statusBarBlue = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.appDelegate.window.frame.size.width, 20)]; [self.statusBarBlue setBackgroundColor:[UIColor blueColor]]; [self.appDelegate.window.rootViewController.view addSubview:self.statusBarBlack]; [self.appDelegate.window.rootViewController.view addSubview:self.statusBarBlue]; 

Maintenant, si vous utilisez SWRevealViewController vous pouvez utiliser le code suivant, sinon, construisez-le vous-même, dans SWRevealViewController.m juste #import "AppDelegate.h" et remplacez la méthode touchesMoved par celle-ci:

 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesMoved:touches withEvent:event]; if (self.state == UIGestureRecognizerStateFailed) return; // Change color of status bar by the location of your swipe AppDelegate *appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate; UITouch *currentTouch = [touches anyObject]; CGPoint currentTouchLocationOnWindow = [currentTouch locationInView:appDelegate.window]; appDelegate.splashScreen.blueStatusBar.alpha = currentTouchLocationOnWindow.x / appDelegate.window.frame.size.width; if ( _dragging ) return; const int kDirectionPanThreshold = 5; UITouch *touch = [touches anyObject]; CGPoint nowPoint = [touch locationInView:self.view]; CGFloat moveX = nowPoint.x - _init.x; CGFloat moveY = nowPoint.y - _init.y; if (abs(moveX) > kDirectionPanThreshold) { if (_direction == SWDirectionPanGestureRecognizerHorizontal) _dragging = YES; else self.state = UIGestureRecognizerStateFailed; } else if (abs(moveY) > kDirectionPanThreshold) { if (_direction == SWDirectionPanGestureRecognizerVertical) _dragging = YES ; else self.state = UIGestureRecognizerStateFailed; } } 

Maintenant, allez un petit peu et searchz la méthode rightRevealToggleAnimated et remplacez-la par celle-ci:

 - (void)rightRevealToggleAnimated:(BOOL)animated { FrontViewPosition toogledFrontViewPosition = FrontViewPositionLeft; if (_frontViewPosition >= FrontViewPositionLeft) { toogledFrontViewPosition = FrontViewPositionLeftSide; [UIView animateWithDuration:0.3 animations:^{ // Change color of status bar AppDelegate *appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate; appDelegate.splashScreen.blueStatusBar.alpha = 0.0; }]; } else { [UIView animateWithDuration:0.3 animations:^{ // Change color of status bar AppDelegate *appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate; appDelegate.splashScreen.blueStatusBar.alpha = 1.0; }]; } [self setFrontViewPosition:toogledFrontViewPosition animated:animated]; } 

Cela devrait faire l'affaire, profitez-en!

Dans iOS 7, la vue de vos controllers de vue est en plein écran. Vous pouvez donc placer deux vues l'une sur l'autre au haut de la px 22 (hauteur de la barre d'état) de la vue. Le fond noir et le haut sont de la même couleur que votre barre de navigation. Lorsque vous SWRevealViewController à SWRevealViewController , avec l'une des methods déléguées UIScrollView , vous pouvez calculer la distance entre les pourcentages et appliquer cette valeur à l'opacité de la sous-vue avec la couleur de votre barre de navigation.

J'ai eu une autre approche qui a fonctionné comme un charme aussi.

first int le SWRevealViewController.h à la class SWRevealView Je crée un View @property appelé underStatusBarView à mettre à la position de la barre d'état.

puis dans le - (id)initWithFrame:(CGRect)frame controller:(SWRevealViewController*)controller méthode du - (id)initWithFrame:(CGRect)frame controller:(SWRevealViewController*)controller @property le @property définissez sa couleur au noir et son alpha à 0.

 - (id)initWithFrame:(CGRect)frame controller:(SWRevealViewController*)controller { self = [super initWithFrame:frame]; if ( self ) { _c = controller; CGRect bounds = self.bounds; _frontView = [[UIView alloc] initWithFrame:bounds]; _frontView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; [self addSubview:_frontView]; CALayer *frontViewLayer = _frontView.layer; frontViewLayer.masksToBounds = NO; frontViewLayer.shadowColor = [UIColor blackColor].CGColor; /* Here starts my under status bar implementation */ CGRect statusFrame = [[UIApplication sharedApplication]statusBarFrame]; _underStatusBarView = [[UIView alloc]initWithFrame:statusFrame]; [_underStatusBarView setBackgroundColor:[UIColor blackColor]]; [_underStatusBarView setAlpha:0.0]; [self addSubview:_underStatusBarView]; /* here it ends */ //frontViewLayer.shadowOpacity = 1.0f; frontViewLayer.shadowOpacity = _c.frontViewShadowOpacity; frontViewLayer.shadowOffset = _c.frontViewShadowOffset; frontViewLayer.shadowRadius = _c.frontViewShadowRadius; } return self; } 

Puis j'ai ajouté une seule ligne de code à la méthode privée responsable de la disposition des vues arrière - (void)_layoutRearViewsForLocation:(CGFloat)xLocation pour changer l'alpha _underStatusBarView fonction de l'location de la vue de face.

 - (void)_layoutRearViewsForLocation:(CGFloat)xLocation { CGRect bounds = self.bounds; CGFloat rearRevealWidth = _c.rearViewRevealWidth; if ( rearRevealWidth < 0) rearRevealWidth = bounds.size.width + _c.rearViewRevealWidth; CGFloat rearXLocation = scaledValue(xLocation, -_c.rearViewRevealDisplacement, 0, 0, rearRevealWidth); CGFloat rearWidth = rearRevealWidth + _c.rearViewRevealOverdraw; _rearView.frame = CGRectMake(rearXLocation, 0.0, rearWidth, bounds.size.height); CGFloat rightRevealWidth = _c.rightViewRevealWidth; if ( rightRevealWidth < 0) rightRevealWidth = bounds.size.width + _c.rightViewRevealWidth; CGFloat rightXLocation = scaledValue(xLocation, 0, _c.rightViewRevealDisplacement, -rightRevealWidth, 0); CGFloat rightWidth = rightRevealWidth + _c.rightViewRevealOverdraw; _rightView.frame = CGRectMake(bounds.size.width-rightWidth+rightXLocation, 0.0f, rightWidth, bounds.size.height); /*this line changes the under status bar view alpha*/ _underStatusBarView.alpha = xLocation/rearRevealWidth; } 

Comment vous utilisez le rightRevealView vous devriez changer le rearRevealWidht à rightRevealWidth juste pour éviter de futurs problèmes de compatibilité.

J'ai vraiment aimé votre approche. J'ai fait quelques mises à jour de votre code et je veux le soumettre au projet. Si vous avez des problèmes avec moi, faites le moi savoir.