Это распространенная проблема при добавлении контроллеров представления в панель вкладок.
Из документации Apple ( Контроллеры панели вкладок - панели вкладок и полноэкранный макет ):
Контроллеры панели вкладок поддерживают полноэкранную компоновку не так, как большинство других контроллеров.Вы все еще можете установить для свойства WantFullScreenLayout своего пользовательского контроллера представления значение YES, если хотите, чтобы его представление перекрывало строку состояния или панель навигации (если имеется).Однако установка этого свойства в YES не приводит к тому, что представление пересекается с представлением панели вкладок.Контроллер панели вкладок всегда изменяет размер вашего представления, чтобы он не перекрывал панель вкладок.
В словах кода вы должны сделать следующее:
UINavigationController *myNavController = [[UINavigationView alloc] init];
myNavController.wantsFullScreenLayout = YES;
//...
NSArray* controllers = [NSArray arrayWithObjects:myNavController, nil];
myTabBarController.viewControllers = controllers;
If, однако , вы сталкиваетесь с проблемой, заключающейся в том, что при открытии приложения с ориентацией, отличной от UIInterfaceOrientationPortrait
, ваше представление myNavController
перемещается на 20 пикселей выше экрана, тогда вы будете динамически устанавливать свойство wantsFullScreenLayout
контроллера(вместо вышеуказанного решения), в зависимости от начальной ориентации.Я делаю это, используя статическую переменную, определенную в реализации вашего контроллера навигации:
static UIInterfaceOrientation _initialOrientation = -1;
После этого вам нужно перегрузить метод viewDidAppear:
и установить переменную соответствующим образом:
- (void)viewDidAppear:(BOOL)animated
{
if (_initialOrientation == -1)
_initialOrientation = [[UIApplication sharedApplication] statusBarOrientation];
self.wantsFullScreenLayout = (_initialOrientation != UIInterfaceOrientationPortrait);
[super viewDidAppear:animated];
}
Надеюсьэто помогает.