ios objective-c ios7 uinavigationbar uistatusbar

UIStatusBar como en la nueva aplicación iOS7 de Facebook



objective-c uinavigationbar (3)

Tengo una aplicación con menú de barra lateral, como el menú de la barra lateral de Facebook. Estoy usando esta clase llamada SWRevealViewController y está funcionando muy bien. Ahora que salió iOS7, no puedo entender cómo ajustar mi estado y la barra de navegación para que sea como en la aplicación de Facebook.

Como puede ver, en la aplicación de Facebook, cuando el usuario desliza la pantalla y abre el menú, la barra de estado cambia de Color de barra azul de navegación a negro con animación de Fundido. En mi aplicación, el usuario desliza la pantalla para abrir el menú y la barra de estado con el color azul (que es azul debido a esa vista Barra de navegación) no se desvanecerá y cambiará el color a negro.

Además, otro problema que estoy teniendo, simplemente no puedo cambiar el color del texto de StatusBar a blanco. Probé todo, cada código en Internet, leí toda la documentación de Apple, pero aún no pude cambiar el color.

También utilicé este código:

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

Gracias por adelantado.

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

ACTUALIZACIÓN : La solución a este problema como en la respuesta @yoeriboven es poner 2 vistas en la parte superior del SWRevealViewController con color negro y azul y animar las dos, esta es una gran solución y funcionó muy bien.

Entonces, al crear el revealController, he creado 2 UIViews en blanco y las he añadido, una azul y una negra. Uno de ellos, el negro, lo oculté por ahora.

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];

Ahora, si está utilizando SWRevealViewController , puede usar el siguiente código, de lo contrario, simplemente compile por su cuenta, dentro de SWRevealViewController.m simplemente SWRevealViewController.m #import "AppDelegate.h" y luego reemplace el método touchesMoved con este:

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

Ahora baje un poco y busque el método rightRevealToggleAnimated y reemplácela con esta:

- (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]; }

Eso debería hacer el truco, ¡disfrútalo!


Tenía otro enfoque que funcionaba como un encanto también.

primero int SWRevealViewController.h en la clase SWRevealView. Creo una View @property llamada underStatusBarView para colocarla en la posición de la barra de estado.

luego, en el - (id)initWithFrame:(CGRect)frame controller:(SWRevealViewController*)controller método del - (id)initWithFrame:(CGRect)frame controller:(SWRevealViewController*)controller I instanciar @property establece su color en negro y su alfa en 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; }

Luego agregué una sola línea de código al método privado responsable de diseñar las vistas posteriores - (void)_layoutRearViewsForLocation:(CGFloat)xLocation para cambiar el alfa _underStatusBarView acuerdo con la ubicación de la vista frontal.

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

Como está usando el ReRealView correcto, debe cambiar el rearRevealWidht de rightRevealWidth a rightRevealWidth solo para evitar futuros problemas de compatibilidad.


Me gustó mucho tu enfoque. He hecho un par de actualizaciones de tu código y quiero enviarlo al proyecto. Si tiene algún problema conmigo, por favor hágamelo saber.


En iOS 7, la vista de los controladores de vista es a pantalla completa. De modo que podría colocar dos vistas una sobre otra en la parte superior de 22 px (altura de la barra de estado) de la vista. El inferior negro y el superior del mismo color que la barra de navegación. Al SWRevealViewController el SWRevealViewController hacia SWRevealViewController , con uno de los métodos de delegado UIScrollView puede calcular qué tan lejos está en porcentajes y aplicar ese valor a la opacidad de la subvista con el color de la barra de navegación.