Как обновить стиль StatusBar как часть пользовательского перехода

Я использую протокол iOS 7 UIviewControllerAnimatedTransitioning, чтобы представить модальный ViewController с помощью специальной анимации. Анимация работает правильно, однако я хочу, чтобы вновь представленный ViewController имел другой стиль строки состояния, чем представляющий VC.

То, что я вижу, - это то, что -(UIStatusBarStyle)preferredStatusBarStyle вызывается на PRESENTING ViewController (несколько раз на самом деле) и никогда не будет на вновь представленном ViewController. Если я удалю пользовательскую анимацию, все со статусной строкой будет работать так, как я ожидал.

Есть ли что-то особенное, что мне нужно сделать в моей функции animateTransition для обновления контроллера корневого представления или чего-то еще? Я попытался вручную установить statusBar с помощью [UIApplication sharedApplication] setStatusBarStyle, но он не работает (я думаю, потому что я использую стилирование строки состояния на основе контроллера ios 7).

Это мой код для 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];
                     }];
}

Любые указатели очень ценятся!

Ответ 1

С помощью пользовательских переходов iOS 7 можно представить контроллер просмотра, который не является полноэкранным, и, следовательно, не повлияет на внешний вид панели состояния. Вы должны явно указать iOS, что ваш пользовательский контроллер представления фактически контролирует внешний вид строки состояния.

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

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

Там есть дополнительная информация здесь. Надеюсь, что это поможет!

Ответ 2

Это сработало для меня:

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

И тогда вам просто нужно вернуть это значение по методу preferredStatusBarStyle:

- (UIStatusBarStyle) preferredStatusBarStyle {
    return _preferredBarStyle;
}

Надеюсь, это поможет!