IPhone: странное пространство в верхней части UINavigationController

У меня возникла странная проблема с добавлением UINavigationController к моему iPhone-приложению. Я добавляю контроллер следующим образом:

myViewController *viewController = [[myViewController alloc] initWithNibName:@"myView" bundle:nil];

myNavigationViewController *navigationController = [[myNavigationViewController alloc] initWithRootViewController:viewController];

UIView *finalView = myeNavigationViewController.view;

[self.view addSubview:finalView];

Кажется, что все работает так, как планировалось, за исключением того, что я получаю странное белое пространство в верхней части моего представления между строкой состояния и строкой заголовка UINavigationController. alt text http://www.andrewskinner.name/problem.png

Я искал в Интернете, но не знаю, что искать. У кого еще возникла эта проблема? Можете ли вы указать мне в сторону какой-то помощи?

Спасибо заранее.

Ответы

Ответ 2

Что делает линия

UIView *finalView = myeNavigationViewController.view;

добавить код? Он избыточен, так как вы можете добавить представление напрямую, не назначая его сначала в UIView - плюс он неверен, поскольку он ссылается на myNavigationController, а не на navigationController.
Я обычно делаю это

myViewController *viewController = [[myViewController alloc] initWithNibName:@"myView" bundle:nil];    
myNavigationViewController *navigationController = [[myNavigationViewController alloc] initWithRootViewController:viewController];
[navigationController.view setFrame: [self.view bounds]];
navigationController.delegate = self;
[self.view addSubview:[navigationController view]];

Установка рамки в рамки также удаляет пустое пространство в верхней части, о которой вы спрашивали.

Ответ 3

Проблема в том, что UINavigationController в идеале должен быть прямым subView UIWindow. Он будет позиционировать и определять размер самостоятельно. Когда вы добавляете UINavigationController в другое настраиваемое представление подзаголовка UIWindow, вам нужно позаботиться о позиции и размере этого настраиваемого представления, принимая во внимание, отображается ли строка состояния в UIWindow.

Мое предложение состоит в том, чтобы сделать пользовательский вид в качестве подкласса UINavigationController:

mySubClass_NavigationController*nav=[[mySubClass_NavigationController alloc] initWithRootViewController:viewController ];

[myUIWindow addSubview:nav.view];

и внутри mySubClass_NavigationController вы можете выполнить все настройки, которые вы сейчас делаете сами (независимо от того, что этот контроллер).

Ответ 4

Я слишком долго боролся с этим, используя очень похожий код для op, а также имел белый бар над навигационным контроллером.

Моя проблема возникла при добавлении UINavigationController в виде представления в UITabController. Пространство в моем случае было вызвано частью UINavigationBar UINavigationController с учетом строки состояния, и это фактически перекрывало часть представления, которое я пытался показать в UINavigationController.

Это код, который я получил в loadView в одном из моих контроллеров представления UITabBarController.

SomeUITableViewController *screenList = [[SomeUITableViewController alloc] init];

UINavigationController *navController = [[UINavigationController alloc]
                                         initWithRootViewController:screenList];

CGRect frame = [[navController navigationBar] frame];

frame.origin.y = 0; // Was 20, set to 0 to not take into account the status bar.

[[navController navigationBar] setFrame:frame];

[self setView:[navController view]];

Там есть дополнительная информация на http://discussions.apple.com/message.jspa?messageID=7890362.

Ответ 5

В IB есть неявное свойство, называемое "Hides Bottom Bar on Push". Просто проверьте это. Он решил проблему для меня.

Ответ 6

Возможно, вы каким-то образом получили два UIViews, каждый из которых имеет строку состояния. Проверьте xib.