2014-04-27 11 views
11

Używam protokołu iOS 7 UIviewControllerAnimatedTransitioning do przedstawienia modalnego modelu ViewController z niestandardową animacją. Animacja działa poprawnie, ale chcę, aby nowo przedstawiony ViewController miał inny styl paska stanu niż prezentujący VC.Jak zaktualizować styl paska stanu w ramach niestandardowego przejścia

Co ja widzę, że -(UIStatusBarStyle)preferredStatusBarStyle jest wywoływana na prezentowaniu ViewController (kilka razy w rzeczywistości) i nigdy na nowo przedstawiony ViewController. Jeśli usuniemy animację niestandardową, wszystko z paskiem stanu działa tak, jak się spodziewam.

Czy jest coś szczególnego, co należy zrobić w mojej funkcji animateTransition, aby zaktualizować kontroler widoku głównego lub coś podobnego? Próbowałem ręcznie ustawić statusBar z [UIApplication sharedApplication] setStatusBarStyle, ale to nie działa (myślę, ponieważ używam stylu paska stanu na podstawie kontrolera ios 7).

To jest mój kod animateTransition:

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext 
{ 
    UICollectionViewCell *activeCell; 
    if ([self.collectionView.visibleCells containsObject:self.cellForActiveIdeaVC]) { 
     activeCell = self.cellForActiveIdeaVC; 
    } 

    UIView *container = transitionContext.containerView; 
    UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 
    UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 
    UIView *fromView = fromVC.view; 
    UIView *toView = toVC.view; 

    CGRect beginFrame; 
    if (activeCell) { 
     beginFrame = [container convertRect:activeCell.bounds fromView:activeCell]; 
    } else { 
     beginFrame = CGRectMake(container.width/2, container.height/2, 0, 0); 
    } 

    CGRect endFrame = [transitionContext initialFrameForViewController:fromVC]; 

    UIView *move = nil; 
    if (toVC.isBeingPresented) { 
     toView.frame = endFrame; 
     move = [toView snapshotViewAfterScreenUpdates:YES]; 
     move.frame = beginFrame; 
    } else { 
     if (activeCell) { 
      move = [activeCell snapshotViewAfterScreenUpdates:YES]; 
     } else { 
      move = [fromView snapshotViewAfterScreenUpdates:YES]; 
     } 
     move.frame = fromView.frame; 
     [fromView removeFromSuperview]; 
    } 
    [container addSubview:move]; 

    [UIView animateWithDuration:.5 
          delay:0 
     usingSpringWithDamping:700 
      initialSpringVelocity:15 
         options:0 
        animations:^{ 
         move.frame = toVC.isBeingPresented ? endFrame : beginFrame; 
        } 
        completion:^(BOOL finished) { 
         [move removeFromSuperview]; 

         if (toVC.isBeingPresented) { 
          toView.frame = endFrame; 
          [container addSubview:toView]; 
         } else { 
          if (self.cellForActiveIdeaVC) { 
           self.cellForActiveIdeaVC = nil; 
          } 
         } 

         [transitionContext completeTransition:YES]; 
        }]; 
} 

Wszelkie wskazówki mile widziane!

Odpowiedz

24

W przypadku niestandardowych przejść systemu iOS 7 możliwe jest przedstawienie kontrolera widoku, który nie jest w trybie pełnoekranowym, a zatem nie wpłynie na wygląd paska stanu. Musisz wyraźnie powiedzieć systemowi iOS, że Twój niestandardowy kontroler widoku będzie kontrolować wygląd paska stanu.

UIViewController *controllerToPresent = [...] 
controllerToPresent.modalPresentationStyle = UIModalPresentationStyleCustom; 
controllerToPresent.modalPresentationCapturesStatusBarAppearance = YES; 

[self presentViewController:controllerToPresent animated:YES completion:nil]; 

Jest kilka more information here. Mam nadzieję, że pomaga!

+1

Wiedziałem, że to coś takiego, po prostu nie mogłem znaleźć to ustawienie. Dzięki wielkie! –

0

Ten pracował dla mnie:

[UIView animateWithDuration:0.25 
          delay:0 
         options:UIViewAnimationOptionCurveEaseOut 
        animations:^{ 
         _preferredBarStyle = UIStatusBarStyleLightContent; 
         [self setNeedsStatusBarAppearanceUpdate]; 
        }]; 

A potem po prostu trzeba zwrócić tę wartość na metodzie preferredStatusBarStyle:

- (UIStatusBarStyle) preferredStatusBarStyle { 
    return _preferredBarStyle; 
} 

Mam nadzieję, że to pomaga!

+0

Nie działa niestety, childViewControllerForStatusBarStyle/preferredStatusBarStyle nie są wywoływane na moim najbardziej top kontroler widoku z jakiegoś powodu. Ciągle pyta kontrolera przedstawiającego widok, a nie nowego prezentowanego modalnie, który pojawia się na górze. –

+0

(A jak już powiedziałem, że usunę niestandardową animację, działa poprawnie, więc uważam, że poprawnie zaimplementowałem te metody - to coś z niestandardową animacją) –

Powiązane problemy