3

У меня есть пользовательский UIPresentationController и переопределяет frameOfPresentedViewInContainerView для пользовательского представления viewController. Все работает нормально, за исключением строки состояния.Как использовать modalPresentationCapturesStatusBarAppearance = НЕТ с пользовательским UIPresentationController?

Я не хочу, чтобы панель состояния меняла внешний вид вообще - она ​​должна просто оставаться, но она выглядела раньше. Теперь Apple Documentation: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instp/UIViewController/modalPresentationCapturesStatusBarAppearance говорит, что если modalPresentationStyle не является UIModalPresentationFullScreen ИЛИ modalPresentationCapturesStatusBarAppearance - нет, я должен быть в порядке, и строка состояния не должна меняться.

С помощью этого кода:

- (BOOL)prefersStatusBarHidden { 
    NSLog(
     @"prefersStatusBarHidden was called %d %ld", 
     self.modalPresentationCapturesStatusBarAppearance, 
     (long)self.modalPresentationStyle 
    ); 

    return YES; 
} 

Я могу видеть, что prefersStatusBarHidden называется, даже если modalPresentationCapturesStatusBarAppearance НИКАКОЙ (отображается как 0) и modalPresentationStyle является UIModalPresentationCustom (отображается как 4).

Очевидно, что это является причиной изменения строки состояния при представлении viewController.

Но почему?

Моя мысль об этом заключается в том, что iOS считает, что viewController представлен в полноэкранном режиме, даже если это не так.

Я обнаружил, что свойство UIPresentationController shouldPresentInFullscreen - оно возвращает YES по умолчанию. Возвращение NO не помогает вообще, поэтому я не понимаю, что это свойство даже делает ... Это не имеет никакого эффекта. То же самое относится к свойству presentationStyle - я не вижу никакого эффекта при его изменении. Я бы ожидал, что свойство presentationStyle будет «перенаправлено» на свойство viewControllers modalPresentationStyle, но это останется в UIModalPresentationCustom, который должен состоять в том, чтобы инициировать пользовательскую презентацию в первую очередь.

Итак, мои вопросы: кто-нибудь знает, как просто сохранить строку состояния так же, как с пользовательским UIPresentationController, - и может ли кто-нибудь объяснить свойства shouldPresentInFullscreen и presentationStyle?

Спасибо! :)

+1

Вы когда-нибудь разбирали это? Я также пытаюсь заставить UIPresentationController не отображать полный экран (на самом деле я хочу иметь возможность взаимодействовать с некоторыми базовыми элементами представления - как панель вкладок). Я не могу понять, как заставить его предоставить мне presentingViewController, который не является контроллером корневого представления окна. –

+0

Нет, к сожалению, я так и не понял :( –

+0

Похоже, это было исправлено в iOS 10. Я придумал хакерское решение для iOS 9 здесь: https: // stackoverflow.com/questions/34819013/presenting-a-view-controller-without-change-the-status-bar-color-like-uialert/34819014 # 34819014 –

ответ

0

Попробуйте реализовать childViewControllerForStatusBarStyle: и возвратите нуль для него в класс, вызывающий ваш UIPresentationController, обычно UINavigationController.

Это то, что я делаю в Swift, когда я не хочу ребенка VC мешать моим умом выбранной строки состояния Стиль:

override func childViewControllerForStatusBarStyle() -> UIViewController? { 
    return nil // ignore childs and let this Navigation Controller handle the StatusBar style 
} 

override func preferredStatusBarStyle() -> UIStatusBarStyle { 
    return .LightContent // or .Default depending on your Style 
} 

Это требует iOS8 и новее и может использоваться только, если вы устанавливаете ключ UIViewControllerBasedStatusBarAppearance в вашем Info.plist до YES.

Бонус: Если это не помогает в вызывающем, используйте его в показанном Ccontroller. Я проверил свои проекты, в одном из них он также находится в NavigationController, показанный как PopOver, и работает нормально на сегодняшний день.

+0

Это действительно не отвечает на вопрос, я имею в виду, d требуется, чтобы UIPresentationController был повторно использован, не требуя, чтобы что-то было реализовано во всех представленных контроллерах представления. И реализация чего-либо в представлении диспетчера представлений вместо представленных ничего не делает, вот о чем вопрос ... Но да, вы правы в отношении «Бонуса», в настоящее время это единственный способ сделать это. –

+0

@TedBuckland Вы правы, извините, что на самом деле это не отвечало на ваш вопрос, почему это происходит вообще. Честно говоря: я не могу ответить на эту часть вопроса, просто покажу, как я знаю, как обойти эту проблему. Управление статусом в iOS, очевидно, неверно для некоторых ситуаций. Это не должно быть необходимо, возможно, лучше всего открыть билет на радиолокатор. У меня есть сообщение о SO об этой проблеме относительно UIActivityViewController, которая сейчас не установлена: http://stackoverflow.com/questions/35874582/set-statusbar-color-for-extensions-in-uiactivityviewcontroller. –