Question Comment mettre à jour le style StatusBar dans le cadre d'une transition personnalisée


J'utilise iOS 7 UIviewControllerAnimatedTransitioning protocole pour présenter un modal ViewController avec une animation personnalisée. L'animation fonctionne correctement, cependant, je veux que la nouvelle présentation ViewController avoir un style de barre de statut différent de celui de la VC de présentation.

Ce que je vois c'est que -(UIStatusBarStyle)preferredStatusBarStyle fait appel à la présentation ViewController (plusieurs fois en fait) et jamais sur le nouveau présenté ViewController. Si je supprime l'animation personnalisée tout avec la barre d'état fonctionne comme je l'espère.

Y a-t-il quelque chose de spécial à faire dans ma fonction animateTransition pour mettre à jour le contrôleur de la vue racine ou quelque chose? J'ai essayé de définir manuellement la barre d'état avec [UIApplication sharedApplication] setStatusBarStyle mais cela ne fonctionne pas (je pense parce que j'utilise le style de barre d'état basé sur le contrôleur de vue ios 7).

Ceci est mon code pour 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];
                     }];
}

Tout pointeur très apprécié!


12
2018-04-27 21:52


origine


Réponses:


Avec les transitions personnalisées d'iOS 7, il est possible de présenter un contrôleur de vue qui n'est pas en plein écran et n'affecterait donc pas l'apparence de la barre d'état. Vous devez indiquer explicitement à iOS que votre contrôleur de vue personnalisé va en fait contrôler l'apparence de la barre d'état.

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

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

Il y en a plus d'informations ici. J'espère que cela pourra aider!


25
2018-05-01 03:45



Cela a fonctionné pour moi:

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

Et puis il vous suffit de retourner cette valeur sur le preferredStatusBarStyle méthode:

- (UIStatusBarStyle) preferredStatusBarStyle {
    return _preferredBarStyle;
}

J'espère que ça aide!


0
2018-04-28 14:18