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.