Как строка состояния In-Call влияет на размер представления UIViewController?
Я пытаюсь понять, как view
связанное с UITabBarController
, UINavigationController
или UIViewController
реагирует на переключение строки состояния в вызове.
Моя проблема в том, что они, кажется, ведут себя по-разному, и это вызывает у меня побочные эффекты.
Я сделал проект, который изменяет корневой контроллер вида окна для 3-х типов выше, и я выкидываю description
view
чтобы получить координаты кадра.
![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, не изменяет свои свойства кадра при переключении строки состояния в вызове?! (Зачем? :( )
OFF
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, мое тоже не реагирует: (
Ответы
Ответ 1
Высота представления, когда переключается строка состояния во время вызова, зависит от способа привязки.
Поиграйте с помощью функции autoResizingMask UIView, чтобы контролировать, должно ли представление перемещаться вниз или изменять размер, когда отображается строка состояния вызова.
Эти два свойства,
UIViewAutoresizingFlexibleTopMargin
UIViewAutoresizingFlexibleHeight
поможет вам. Первый из них сдвигает представление вниз, второе меняет размер.
Ответ 2
В вашем обычном примере UIViewController значение [ wantsFullScreenLayout
] установлено равным NO, что приводит к тому, что вид будет автоматически установлен таким образом, чтобы он не попадал под строку состояния.
UINavigationController и UITabBarController, с другой стороны, по умолчанию wantsFullScreenLayout
- YES. Таким образом, их взгляды занимают все окно, и они сами определяют размер и положение своих подзонов, чтобы надлежащим образом обрабатывать строку состояния. Если вы явно задали свойство на этих контроллерах НЕТ, вы должны получить желаемое поведение (но затем потеряете способность правильно обрабатывать дочерние контроллеры, которые устанавливают wantsFullScreenLayout
в YES, если вам это интересно).
В вашем примере UITabBarController, BTW, кажется, что вы не печатаете информацию для представления контроллера панели вкладок; здесь это UILayoutContainerView, а не простой UIView.
Ответ 3
В идеале вы должны забыть о том, насколько размер изображения будет изменен и будет воспроизводиться с помощью маски Autoresizing.