Подтвердить что ты не робот

Как строка состояния In-Call влияет на размер представления UIViewController?

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

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


  • UIViewController

enter image description here

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

 UIView: 0x4e2a1f0; кадр = (0 20; 320 460); авторазмер = W + H;....
НА
 UIView: 0x4e2a1f0; кадр = (0 40; 320 440); авторазмер = W + H;...

Это я понимаю: когда появляется строка состояния в вызове, высота представления UIViewController уменьшается и теряет 20, а его координата y перемещается от 20 до 40.

Это идеально! Я ожидал бы того же при замене классического UIViewController на UITabBarController или UINavigationController но это не так!


  • UINavigationController

    enter image description here

Строка состояния InCall ВЫКЛ

 UILayoutContainerView: 0x4b35ab0; кадр = (0 0; 320 480); авторазмер = W + H; ..
НА
 UILayoutContainerView: 0x4e1b060; кадр = (0 0; 320 480); авторазмер = W + H; ..

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


  • UITabBarController

enter image description hereOFF

 UIView: 0x4b2f6a0; кадр = (0 20; 320 460); авторазмер = W + H;...
НА
 UIView: 0x4b2f6a0; кадр = (0 20; 320 460); авторазмер = W + H;...

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


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

4b9b3361

Ответ 1

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

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

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

UIViewAutoresizingFlexibleTopMargin
UIViewAutoresizingFlexibleHeight  

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

Ответ 2

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

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

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

Ответ 3

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