我有一个带侧边栏菜单的应用程序,有点像Facebook侧边栏菜单。我正在使用这个名为SWRevealViewController
的类,效果很好。现在由于iOS7已经推出,我就无法想出如何调整我的状态栏和导航栏,使其像Facebook应用程序那样。
正如您所看到的,在Facebook应用程序中,当用户滑动屏幕并打开菜单时,状态栏会从导航栏蓝色变成黑色,并带有淡入淡出的动画。但在我的应用程序中,用户滑动屏幕以打开菜单时,状态栏保持蓝色(因为该视图的NavigationBar是蓝色),不会消失并变成黑色。
此外,我还遇到了另一个问题,我无法将StatusBar文本颜色更改为白色。我尝试了所有互联网上的代码,阅读了苹果的所有文档,但仍然无法成功更改颜色。
我也使用了这段代码:
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation {
return UIStatusBarAnimationFade;
}
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
- (BOOL)prefersStatusBarHidden
{
return NO;
}
提前感谢。
========================================================================
更新:像 @yoeriboven 回答中所述,解决此问题的方法是在SWRevealViewController
上方放置两个视图,一个黑色和一个蓝色,并对这两个视图进行动画处理,这是一个很好的解决方案,它非常有效。
因此,在创建revealController时,我创建了2个空白的UIView并将它们添加到上面,一个是蓝色的,一个是黑色的。其中一个黑色的UIView目前被隐藏了。
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];
如果您正在使用SWRevealViewController
,您可以使用下面的代码。如果没有,请自己构建,在SWRevealViewController.m
中导入#import "AppDelegate.h"
,然后用以下方法替换touchesMoved
方法:
- (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;
}
}
现在向下滚动一点,查找方法rightRevealToggleAnimated
并将其替换为以下内容:
- (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];
}
那应该就可以了,享受吧!
setNeedsStatusBarAppearanceUpdate
。 - Léo Natan