Как строка состояния In-Call влияет на размер представления UIViewController? - PullRequest
21 голосов
/ 30 марта 2011

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

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


  • UIViewController

enter image description here

статус inCall OFF :

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

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

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


  • UINavigationController

    enter image description here

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

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

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


  • UITabBarController

enter image description here OFF

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

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


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

Ответы [ 3 ]

17 голосов
/ 01 июля 2011

Высота просмотра при переключении строки состояния In-Call зависит от способа ее привязки.

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

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

UIViewAutoresizingFlexibleTopMargin
UIViewAutoresizingFlexibleHeight  

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

4 голосов
/ 01 июля 2011

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

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

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

1 голос
/ 04 июля 2011

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

...