6

Facebookのサイドバーメニューのようなサイドバーメニューのあるアプリがあります。私はこのクラスを使用していますが、うまく機能しSWRevealViewControllerています。iOS7 が登場して以来、ステータスとナビゲーション バーを Facebook アプリのように調整する方法がわかりません。

ご覧のとおり、Facebook アプリでは、ユーザーが画面をスライドしてメニューを開くと、ステータス バーがナビゲーション バーの青色からフェード アニメーション付きの黒色に変わります。私のアプリでは、ユーザーが画面をスライドしてメニューを開くと、青色のステータス バー (NavigationBar が表示されているため青色) がフェードアウトして色が黒に変わることはありません。

Facebook アプリのナビゲーション バー

アプリのナビゲーション バー

また、私が抱えている別の問題は、StatusBar のテキストの色を白に変更できないことです。インターネット上のすべてのコード、すべてのアップルのドキュメントを読んでみましたが、それでも色を変更することはできませんでした。

私もこのコードを使用しました:

- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation {
    return UIStatusBarAnimationFade;
}

- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}

- (BOOL)prefersStatusBarHidden
{
    return NO;
}

前もって感謝します。

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

更新:@yoeribovenの回答のように、この問題の解決策は、2つのビューを黒色と青色の上に置きSWRevealViewController、2つをアニメーション化することです。これは素晴らしい解決策であり、うまく機能しました。

したがって、releaveController を作成するときに、2 つの空白の UIView を作成して追加しました。1 つは青、もう 1 つは黒です。そのうちの1つ、黒いものは、今のところ隠しておきました。

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 では、View Controller のビューはフルスクリーンです。したがって、ビューの上部 22 ピクセル (ステータス バーの高さ) で 2 つのビューを重ね合わせることができます。下は黒、上はナビゲーション バーと同じ色です。にスワイプするとSWRevealViewController、デリゲート メソッドの 1 つをUIScrollView使用してパーセンテージで計算し、その値をナビゲーション バーの色でサブビューの不透明度に適用できます。

于 2013-10-02T13:07:50.690 に答える
3

魅力的に機能する別のアプローチもありました。

まず、SWRevealView クラスで SWRevealViewController.h を intし、ステータス バーの位置に配置するView @property呼び出しを作成します。underStatusBarView

次に、- (id)initWithFrame:(CGRect)frame controller:(SWRevealViewController*)controllerメソッドで、@propertyセットの色を黒に、アルファを 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;
}

次に、背面図のレイアウトを担当するプライベート メソッドに 1 行のコードを追加して、正面図の位置に応じてアルファ- (void)_layoutRearViewsForLocation:(CGFloat)xLocationを変更しました。_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 の使用方法は、将来の互換性の問題を防ぐためだけにrearRevealWidht変更する必要があります。rightRevealWidth

于 2013-10-25T05:35:53.407 に答える
0

あなたのアプローチがとても気に入りました。あなたのコードをいくつか更新しましたので、プロジェクトに提出したいと思います。私がそうすることに問題がある場合は、私に知らせてください。

于 2014-01-31T17:47:46.557 に答える