Контроллер обновления строки состояния iOS во время вызова представлен модально на экране

Я могу задать этот вопрос, потому что после больших исследований почти 2 дня гугления, переполнения стека и т. Д.

Моя проблема такова: я представляю ViewController из моего основного ViewController следующим образом:

UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:VController];
navigation.transitioningDelegate = self;
navigation.modalPresentationStyle = UIModalPresentationCustom;

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

всякий раз, когда пользователь iPhone разговаривает по телефону или использует свой телефон в качестве точки доступа, строка состояния увеличивается, толкая мой модально представленный VC вниз, но источник установлен на (0; 0). Проблема заключается в том, что пользователь завершает вызов во время он в строке состояния моего приложения изменяет размер до нормального размера, но Modal VC не перемещается вверх.

введите здесь описание изображения

Я знал об этом, когда это произошло в коде, благодаря этому уведомлению:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statuBarChange:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil];

Хуже всего то, что кадры правильные, а происхождение все еще (0,0)

Есть ли способ обновить модальное представление vc? без увольнения и представления его снова?


person Shial    schedule 07.01.2015    source источник
comment
Почему вы голосуете против? Я написал этот вопрос, чтобы найти и ответить. Нет ничего похожего в поведении представленного модального ВК и строки состояния inCall. Если вы проголосуете против, пожалуйста, объясните, почему, тогда я могу понять это.   -  person Shial    schedule 07.01.2015


Ответы (1)


Вам действительно нужен пользовательский переход для этого модального окна? Если нет, удалите строку «navigation.modalPresentationStyle = UIModalPresentationCustom», и все готово.

Если вам нужен собственный стиль, это известная ошибка стиля UIModalPresentationCustom в iOS 8+ и строки состояния. Насколько я знаю, вам придется обойти это с помощью animateTransition и расставить кадры по нужным местам.

Для этого также есть ужасный хак с использованием willChangeStatusBarFrame в делегате приложения ниже. Вы можете улучшить его, обнаружив, действительно ли есть модальное окно, и анимировать изменение.

- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame
{
    if (newStatusBarFrame.size.height < 40) {
        for (UIView *view in self.window.subviews) {
            view.frame = self.window.bounds;
        }
    }
}

Другая альтернатива состоит в том, чтобы модальное окно закрывало строку состояния и переопределяло PreferStatusBarHidden для этого контроллера представления.

Я ненавижу все эти решения, но они должны дать вам что-то работоспособное в зависимости от того, как настроен ваш проект, и если вы не можете игнорировать это небольшое пространство для временного модального диалога.

person Ben    schedule 07.02.2017