Проблема действительно в том, что навигационный контроллер всегда ожидает оставить место для строки состояния, которая составляет 20 пикселей. Я некоторое время искал, прежде чем нашел это решение, которое работает:
//nav is assumed to be a subclass or instance of UINavigationController
nav.view.frame = CGRectOffset(nav.view.frame, 0.0, -20.0);
//you can then add the navigation's view as a subview to something else
Первоначально я нашел ответ, который сместил это представление панели навигации, но он не работал. Это работает, когда вы делаете это с фактическим видом навигационных контроллеров.
Я использую эту технику, чтобы добавить контроллер навигации из другого пера в пустой вид моего основного пера, чтобы я мог расположить его в любом месте основного экрана в качестве подпредставления. Используя пустое представление в качестве заполнителя и позиционирующего фрейма на моём главном перо, я создаю отдельный перо и класс для управления навигацией, который управляет другими перьями, используемыми для управления их экранами. Таким образом, я могу решить классический «как добавить баннер, изображение или пользовательские виды над моим контроллером навигации», имея при этом контроллер навигации в качестве подпредставления ... в iOS 5, если быть точным.
Стоит также упомянуть, что я использую делегат приложения для хранения и доступа ко всем другим контроллерам, поэтому они сохраняются постоянным экземпляром, к которому я могу получить доступ из любого класса. Создайте и синтезируйте некоторые свойства в приложении делегата всех ваших контроллеров, а в viewDidLoad создайте экземпляры. Таким образом, я могу ссылаться на все контроллеры, используемые в моем приложении позже, где угодно, добавив:
//this shows how to store your navigation controllers in the app delegate
//assumes you've added 2 properties (UINavigationController*)"navController" and (UIViewController*)"rootController" in your app delegate
//...don't forget to add #import "AppDelegate.h" to the top of the file
AppDelegate *app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
[app.navController pushViewController: app.rootController animated:YES];
//now apply the offset trick to remove the status gap
app.navController.view.frame = CGRectOffset(app.navController.view.frame, 0.0, -20.0);