Как строка состояния 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.
В идеале вы должны забыть о том, насколько сильно изменяется размер представления, и поиграть с маской авторазмера.