【发布时间】:2013-10-02 12:56:15
【问题描述】:
我有一个带有侧边栏菜单的应用程序,有点像 Facebook 侧边栏菜单。我正在使用这个名为SWRevealViewController 的类,它运行良好。现在自从 iOS7 出来了,我就是不知道如何调整我的状态和导航栏,就像在 Facebook 应用程序中一样。
如您所见,在 Facebook 应用程序中,当用户滑动屏幕并打开菜单时,状态栏会从导航栏的蓝色变为黑色并带有淡入淡出动画。在我的应用程序中,用户滑动屏幕以打开菜单,蓝色的状态栏(由于该视图 NavigationBar 是蓝色的)不会消失并将颜色变为黑色。
另外,我遇到的另一个问题是,我无法将 StatusBar 文本颜色更改为白色。我已经尝试了一切,互联网上的每一段代码,阅读了所有苹果的文档,但仍然无法改变颜色。
我也用过这段代码:
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation {
return UIStatusBarAnimationFade;
}
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
- (BOOL)prefersStatusBarHidden
{
return NO;
}
提前致谢。
================================================ ==========================
更新:在@yoeriboven 的回答中,这个问题的解决方案是在SWRevealViewController 的顶部放置两个视图,黑色和蓝色,然后只为这两个设置动画,这很棒解决方案,效果很好。
所以,在创建revealController 时,我创建了2 个空白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。 -
我在 viewDidLoad 方法上调用它,还是一样。
-
我不确定这是不是正确的地方。在 viewDidAppear 中尝试。
-
放在 viewDidAppear 和 viewWillAppear 中,还是一样的结果。
标签: ios objective-c ios7 uinavigationbar uistatusbar