6

我有一个带有侧边栏菜单的应用程序,有点像 Facebook 侧边栏菜单。我正在使用这个类SWRevealViewController,它工作得很好。现在自从 iOS7 出来了,我就是不知道如何调整我的状态和导航栏,就像在 Facebook 应用程序中一样。

如您所见,在 Facebook 应用程序中,当用户滑动屏幕并打开菜单时,状态栏会从 Navigation Bar 的蓝色变为黑色,并带有 Fade 动画。在我的应用程序中,用户滑动屏幕以打开菜单,蓝色的状态栏(由于该视图 NavigationBar 是蓝色的)不会消失并将颜色变为黑色。

脸书应用导航栏

我的应用导航栏

另外,我遇​​到的另一个问题是,我无法将 StatusBar 文本颜色更改为白色。我已经尝试了一切,互联网上的每一段代码,阅读了所有苹果的文档,但仍然无法改变颜色。

我也使用了这段代码:

- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation {
    return UIStatusBarAnimationFade;
}

- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}

- (BOOL)prefersStatusBarHidden
{
    return NO;
}

提前致谢。

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

更新SWRevealViewController:@yoeriboven 回答中的这个问题的解决方案是在黑色和蓝色的顶部放置 2 个视图,并为两者设置动画,这是一个很好的解决方案,而且效果很好。

因此,在创建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];
}

这应该可以解决问题,享受吧!

4

3 回答 3

7

在 iOS 7 中,您的视图控制器的视图是全屏的。因此,您可以在视图的顶部 22 像素(状态栏高度)处将两个视图相互叠加。底部的黑色和顶部的颜色与您的导航栏相同。当滑动到SWRevealViewController, 使用其中一种UIScrollView委托方法时,您可以计算它的百分比,并将该值应用于具有导航栏颜色的子视图的不透明度。

于 2013-10-02T13:07:50.690 回答
3

我还有另一种方法,它也很有魅力。

首先在 SWRevealView 类中输入 SWRevealViewController.h 我创建了一个View @property名为underStatusBarView以放置在状态栏位置。

然后在- (id)initWithFrame:(CGRect)frame controller:(SWRevealViewController*)controller我实例化的方法中,@property将其颜色设置为黑色,并将其 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;
}

然后我在负责布置后视图的私有方法中添加了一行代码,以根据前视图位置- (void)_layoutRearViewsForLocation:(CGFloat)xLocation更改alpha。_underStatusBarView

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

您如何使用 rightRevealView 您应该将其更改为rearRevealWidhtrightRevealWidth防止将来出现兼容性问题。

于 2013-10-25T05:35:53.407 回答
0

我真的很喜欢你的方法。我对您的代码进行了几次更新,并希望将其提交给项目。如果您对我这样做有任何问题,请告诉我。

于 2014-01-31T17:47:46.557 回答