2014-04-27 14 views
11

Sto utilizzando il protocollo iOS 7 UIviewControllerAnimatedTransitioning per presentare un modale ViewController con un'animazione personalizzata. L'animazione funziona correttamente, tuttavia, desidero che la nuova versione ViewController abbia uno stile di barra di stato diverso rispetto al VC di presentazione.Come aggiornare lo stile StatusBar come parte di una transizione personalizzata

Quello che sto vedendo è che -(UIStatusBarStyle)preferredStatusBarStyle viene chiamato sulle PRESENTANO ViewController (più volte in realtà) e mai sul recente presentato ViewController. Se rimuovo l'animazione personalizzata, tutto con la barra di stato funziona come mi aspetterei.

C'è qualcosa di speciale che devo fare nella mia funzione animateTransition per aggiornare il controller di visualizzazione radice o qualcosa del genere? Ho provato a impostare manualmente lo statusBar con [UIApplication sharedApplication] setStatusBarStyle ma non funziona (penso perché sto usando lo stile della barra di stato basato su controller ios 7).

Questo è il mio codice per 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]; 
        }]; 
} 

Tutti gli indicatori molto apprezzati!

risposta

24

Con le transizioni personalizzate di iOS 7, è possibile presentare un controller di visualizzazione che non è a schermo intero e pertanto non influisce sull'aspetto della barra di stato. Devi dire esplicitamente a iOS che il tuo controller di visualizzazione personalizzato, infatti, controllerà l'aspetto della barra di stato.

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

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

C'è un po 'di more information here. Spero possa aiutare!

+1

Sapevo che era qualcosa del genere, non riuscivo a trovare quell'impostazione. Grazie mille! –

0

Questo ha funzionato per me:

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

E allora non resta che restituire questo valore sul metodo preferredStatusBarStyle:

- (UIStatusBarStyle) preferredStatusBarStyle { 
    return _preferredBarStyle; 
} 

Spero che aiuta!

+0

Non ha funzionato purtroppo, childViewControllerForStatusBarStyle/preferredStatusBarStyle non vengono richiamati sul mio controller di visualizzazione più in alto per qualche motivo. Continua a chiedere al controller della presentazione presentativa, non alla nuova presentazione modale che appare in cima. –

+0

(E come ho detto se rimuovo l'animazione personalizzata funziona correttamente, quindi credo di aver implementato questi metodi correttamente - è qualcosa con l'animazione personalizzata) –

Problemi correlati