iPhone: странное место на вершине UINavigationController
-
22-07-2019 - |
Вопрос
У меня странная проблема с добавлением 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 появляется странный пробел. альтернативный текст http://www.andrewskinner.name/problem.png
Я искал в Интернете, но не знаю, что искать. У кого-нибудь еще возникла такая проблема? Можете ли вы указать мне направление на помощь?
Заранее спасибо.
Решение
Ознакомьтесь с ответами на этот вопрос:
Не уверен, почему UIView подталкивается примерно на 10 пикселей
Другие советы
Что значит линия
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]];
Установка рамки на границы также удаляет пустое пространство сверху, о котором вы спрашивали.
Проблема в том, что в идеале UINavigationController должен быть прямым подвидом UIWindow. Он будет позиционировать и размер прямо сам по себе. Когда вы добавляете UINavigationController в другое настраиваемое представление подпредставления UIWindow, вам необходимо позаботиться о положении и размере этого настраиваемого представления, учитывая, отображается ли строка состояния в окне UIWindow.
Я предлагаю сделать пользовательский вид подклассом UINavigationController:
mySubClass_NavigationController*nav=[[mySubClass_NavigationController alloc] initWithRootViewController:viewController ];
[myUIWindow addSubview:nav.view];
и внутри mySubClass_NavigationController вы можете выполнить всю настройку, которую вы делаете сейчас в себе (независимо от того, что это за контроллер). Р>
Я тоже некоторое время боролся с этим, используя очень похожий код с операциями, а также над белой панелью навигации был белый столбик. Р>
Моя проблема возникла при добавлении 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 . Р>
В IB есть скрытое свойство, называемое "Скрывает нижнюю панель при нажатии". Просто проверь это. Это решило проблему для меня.
Может быть, вы как-то получили два UIViews, каждый со строкой состояния. Проверьте XIB.