2013-10-02 6 views
5

Ich habe eine App mit Seitenleiste Menü, ein bisschen wie Facebook Seitenleiste Menü. Ich benutze diese Klasse namens SWRevealViewController und es funktioniert super. Jetzt da iOS7 herausgekommen ist, kann ich einfach nicht herausfinden, wie ich meine Status- und Navigationsleiste an die Facebook-App anpassen kann.UIStatusBar wie in Facebook neue iOS7 Anwendung

Wie Sie sehen können, wird in der Facebook App, wenn der Benutzer den Bildschirm verschiebt und das Menü öffnet, die Statusleiste von der blauen Navigationsleiste mit Fade-Animation in schwarz wechseln. In meiner App verschiebt der Benutzer den Bildschirm, um das Menü zu öffnen und die Statusleiste mit der blauen Farbe (das ist blau wegen dieser Ansicht NavigationBar) wird nicht verblassen und ändern Sie die Farbe in schwarz.

facebook app navigation bar

my app navigation bar

Auch ein anderes Problem, das ich habe, ich kann einfach nicht die Textfarbe weiß StatusBar ändern. Ich habe alles probiert, jedes Stück Code im Internet, habe alle Apple-Dokumente gelesen, konnte aber die Farbe nicht ändern.

habe ich auch diesen Code:

- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation { 
    return UIStatusBarAnimationFade; 
} 

- (UIStatusBarStyle)preferredStatusBarStyle { 
    return UIStatusBarStyleLightContent; 
} 

- (BOOL)prefersStatusBarHidden 
{ 
    return NO; 
} 

Vielen Dank im Voraus.

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

UPDATE: Die Lösung für dieses Problem wie in @yoeriboven Antwort ist es, 2 Ansichten auf Spitze der SWRevealViewController mit schwarzer Farbe und blauer Farbe und animiere einfach die zwei, das ist eine großartige Lösung und es hat einfach super geklappt.

Also, beim Erstellen der LaibungController habe ich 2 leere UIViews erstellt und hinzugefügt, eine blaue und eine schwarze. Einer von ihnen, der Schwarze, blieb für den Moment verborgen.

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]; 

Nun, wenn Sie SWRevealViewController verwenden Sie den nächsten Code verwenden können, wenn nicht, bauen sie einfach auf eigene Faust, innerhalb SWRevealViewController.m nur #import "AppDelegate.h" und als Ersatz die touchesMoved Methode mit dieser:

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

gehen sie nun ein wenig nach unten und suchen sie nach der Methode rightRevealToggleAnimated und ersetzen sie mit dieser:

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

Das sollte genügen, viel Spaß!

+0

Wenn die Statusleiste Stil zu ändern, vergessen Sie nicht, 'setNeedsStatusBarAppearanceUpdate' auf der präsentierten View-Controller aufzurufen. –

+0

Ich rufe das auf der ViewDidLoad-Methode, immer noch das gleiche. –

+0

Ich bin mir nicht sicher, dass dies der richtige Ort ist. Versuchen Sie es in viewDidAppear. –

Antwort

6

In iOS 7 ist die Ansicht Ihrer View-Controller im Vollbildmodus. So könnten Sie einfach zwei Ansichten übereinander auf den oberen 22 px (Statusleistenhöhe) der Ansicht platzieren. Der untere schwarze und der obere die gleiche Farbe wie Ihre Navigationsleiste. Wenn Sie mit einer der Delegatmethoden SWRevealViewController zu der SWRevealViewController Wischen, können Sie berechnen, wie weit es in Prozent ist, und diesen Wert auf die Opazität der Unteransicht mit der Farbe der Navigationsleiste anwenden.

+0

Dies ist eine großartige Lösung und ich aktualisierte meine Antwort für diejenigen, die dies auch brauchten. Danke, Mann! –

+0

Große Hilfe für Sie. Wäre cool, wenn du meine Antwort richtig überprüfst. Viel Glück mit Ihrem Projekt. – yoeriboven

3

Ich hatte einen anderen Ansatz, der auch wie ein Charme funktionierte.

Zuerst int der SWRevealViewController.h in der Klasse SWRevealView Ich erstelle eine View @property namens underStatusBarView an der Statusleiste Position gesetzt werden.

dann in der - (id)initWithFrame:(CGRect)frame controller:(SWRevealViewController*)controller Methode instanziiert ich die @property stellen Sie die Farbe auf Schwarz und seine 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; 
} 

dann die Rückansichten, die eine einzige Zeile Code in der privaten Methode verantwortlich für das Layout Ich habe - (void)_layoutRearViewsForLocation:(CGFloat)xLocation, um das _underStatusBarView Alpha entsprechend dem Vorderansichtstandort zu ändern.

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

Wie Sie die rightRevealView verwenden, sollten Sie die rearRevealWidht-rightRevealWidth nur ändern Zukunft Kompatibilitätsprobleme zu vermeiden.

+0

Das funktioniert gut im Hochformat, aber wenn ich auf dem iPad in Querformat gehe, geht die schwarze Statusleiste nicht ganz über den oberen Bildschirmrand, wenn die Rückansicht sichtbar ist. Wie behebe ich das? – user2330922

0

Ich mochte Ihren Ansatz. Ich habe einige Änderungen an Ihrem Code vorgenommen und möchte ihn dem Projekt übermitteln. Wenn Sie Probleme mit mir haben, lassen Sie es mich bitte wissen.

+0

Bitte verwenden Sie Kommentare für diese Art von Antworten, verwenden Sie keine Antworten – markcial

+0

Ich habe es versucht. Um die Antwort einer anderen Person kommentieren zu können, müssen Sie mindestens einen Ruf von 50 haben. – dppeak

+0

Bitte verwenden Sie andere Kanäle, wenn Sie können, ist es vorzuziehen, Fragen mit wenigen Antworten zu halten, um nicht Googler oder Leute auf der Suche nach Antworten zu verwirren, Vielen Dank – markcial