Как строка состояния «В вызове» влияет на размер представления UIViewController? (и как правильно обращаться с ним)

Я пытаюсь понять, как реагирует view связанное с UITabBarController , UINavigationController или UIViewController когда UIViewController строка состояния вызова.
Моя проблема в том, что они, похоже, ведут себя по-другому, и это вызывает у меня побочные эффекты ….

Я создал проект, который изменяет controller корневого представления windows для трех типов выше, и я дам description view чтобы получить координаты фрейма.


  • UIViewController

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

inCall статус ВЫКЛ :

 UIView: 0x4e2a1f0;  frame = (0 20; 320 460);  autoresize = W + H;  ....

НА

  UIView: 0x4e2a1f0;  frame = (0 40; 320 440);  autoresize = W + H;  ... 

Это я понимаю: когда появляется строка состояния incall, ширина представления UIViewController сжимается и теряет 20, а координата y – от 20 до 40.

Отлично ! Я бы ожидал того же при замене classического UIViewController с помощью UITabBarController или UINavigationController но это не тот случай!


  • UINavigationController

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

Строка состояния InCall OFF

  UILayoutContainerView: 0x4b35ab0;  frame = (0 0; 320 480);  autoresize = W + H;  .. 

НА

  UILayoutContainerView: 0x4e1b060;  frame = (0 0; 320 480);  autoresize = W + H;  .. 

В этом случае представление, обрабатываемое controllerом UINavigationController, не изменяет его свойства кадра при переключении строки состояния incall?! (Зачем ? 🙁 )


  • UITabBarController

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

  UIView: 0x4b2f6a0;  frame = (0 20; 320 460);  autoresize = W + H;  ... 

НА

  UIView: 0x4b2f6a0;  frame = (0 20; 320 460);  autoresize = W + H;  ... 

То же, что и в UINavigationController : view UITabBarController , похоже, не затрагивается при переключении строки состояния incall.


Может ли кто-нибудь объяснить мне, как это изменение размера работает при отображении строки состояния incall?
Моя конечная цель – отобразить UIView который отображается над всем UITabBarController и который правильно изменяется, когда отображается статус вызова. Тем не менее, я действительно не знаю, где разместить такой вид в иерархии представлений: если я добавлю его в качестве дочернего элемента представления UITabBarController, так как этот не реагирует на отображение состояния incall, моя тоже не реагирует: (

Высота представления, когда переключается строка состояния вызова, зависит от способа привязки.

Играйте с программой autoResizingMask UIView, чтобы контролировать, должно ли представление перемещаться вниз или изменять размер при появлении строки состояния вызова.

Эти два свойства,

 UIViewAutoresizingFlexibleTopMargin UIViewAutoresizingFlexibleHeight 

Вам поможет. Первый из них выдвигает вид вниз, второй меняет размер.

В вашем обычном примере UIViewController значение [ wantsFullScreenLayout ] установлено wantsFullScreenLayout NO, что приводит к тому, что вид будет автоматически установлен таким образом, чтобы он не wantsFullScreenLayout под строку состояния.

С другой стороны, UINavigationController и UITabBarController, по умолчанию, wantsFullScreenLayout чтобы wantsFullScreenLayout YES. Таким образом, их взгляды занимают все окно, и они сами определяют размер и положение своих подзонов, чтобы надлежащим образом обрабатывать строку состояния. Если вы явно задали свойство на этих controllerах НЕТ, вы должны получить wantsFullScreenLayout поведение (но затем потеряете способность правильно обрабатывать дочерние controllerы, которые задают для параметра wantsFullScreenLayout значение YES, если вам это wantsFullScreenLayout ).

В вашем примере UITabBarController, BTW, кажется, что вы не печатаете информацию для представления controllerа панели вкладок; здесь это UILayoutContainerView, а не простой UIView.

В идеале вы должны забыть о том, насколько размер изображения будет изменен и будет воспроизводиться с помощью маски Autoresizing.

Давайте будем гением компьютера.