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

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

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


  • UIViewController

статус 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

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

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

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


  • UITabBarController

OFF

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

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


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

3 ответа

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

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

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

UIViewAutoresizingFlexibleTopMargin
UIViewAutoresizingFlexibleHeight  

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

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

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

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

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

Другие вопросы по тегам