Как строка состояния «В вызове» влияет на размер представления UIViewController? (и как правильно обращаться с ним)
Я пытаюсь понять, как реагирует view
связанное с UITabBarController
, UINavigationController
или UIViewController
когда UIViewController
строка состояния вызова.
Моя проблема в том, что они, похоже, ведут себя по-другому, и это вызывает у меня побочные эффекты ….
Я создал проект, который изменяет controller корневого представления windows для трех типов выше, и я дам description
view
чтобы получить координаты фрейма.
-
UIViewController
- UIModalTransitionStylePartialCurl с UITabBarController
- iPhone: как передавать данные между несколькими Viewcontrollers в приложении Tabbar
- iOS 6 UITabBarController поддерживает ориентацию с текущим controllerом UINavigation
- Как отключить кнопку редактирования, которая отображается в более общем разделе UITabBarController?
- iPhone: Как переключить вкладки с анимацией?
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, моя тоже не реагирует: (
- Как изменить цвет текста и значков для tabBarItems в iOS 7?
- Отображение controllerа входа в систему перед основным controllerом панели вкладок
- Предотrotation автоматического popToRootViewController при двойном касании UITabBarController
- Просмотр controllerов: как программно переключаться между представлениями?
- Скрытие UITabBar при нажатии UIView
- Изменение цвета оттенка / цвета UITabBar
- Контроллер панели вкладок внутри controllerа навигации или общий доступ к корневой панели навигации
Высота представления, когда переключается строка состояния вызова, зависит от способа привязки.
Играйте с программой 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.