UINavigationController имеет дополнительный пробел в строке состояния вверху - PullRequest
10 голосов
/ 16 января 2012

Это выглядело достаточно просто, когда я его настраивал, но я не могу объяснить, почему этот разрыв присутствует между строкой состояния и панелью навигации. Кроме того, автономный вид выглядит так, как будто он правильно выровнен, и это просто панель навигации, которая смещена вниз. Разрыв выглядит как размер строки состояния, поэтому я ожидаю, что это как-то связано с этим, но я не знаю, что.

Nav Bar with extra space

Вот код для настройки контроллера навигации:

- (void)viewDidLoad
{
    [super viewDidLoad];

    advancedVC = [[AdvancedSearchFormVC alloc] initWithNibName:@"AdvancedSearchForm" bundle:nil];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:advancedVC];
    nav.navigationBar.tintColor = [UIColor defaultNavBarTint];
    nav.navigationBar.topItem.title = NSLocalizedString(@"SearchTitle", nil);
    UIBarButtonItem *searchButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"SearchButton", nil) style:UIBarButtonItemStylePlain target:self action:@selector(refreshPropertyList:)];          
    nav.navigationBar.topItem.rightBarButtonItem = searchButton;

    self.view = nav.view;
}

rootViewController использует представление из xib-файла, где я смоделировал строку состояния, панель навигации и панель вкладок.

Ответы [ 7 ]

11 голосов
/ 18 июня 2012

Проблема действительно в том, что навигационный контроллер всегда ожидает оставить место для строки состояния, которая составляет 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);
7 голосов
/ 28 августа 2013

Вы можете попытаться установить атрибут Под верхними столбцами не проверено из Атрибуты раздел UIViewController.

7 голосов
/ 08 июня 2012

У меня была такая же проблема раньше. Код, который я использовал для добавления UINavigationBar в UIViewController:

UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:self];
[self.view  addSubview:nc.view];

Решение:
Установите флажок «Хочет полный экран» с инспектором атрибутов вашего UIViewController.

1 голос
/ 18 февраля 2013

Как мы все знаем, сдвиг в 20 пикселей должен обеспечить место для строки состояния в верхней части. Но на самом деле, система координат контроллеров представления остается на месте, и только рамка навигационной панели сдвигается вниз на 20 пикселей. Это позволяет навигационной панели фактически перекрывать верхние 20 пикселей представления.

Записывая источник кадра навигационной панели, он покажет (0.0, 20.0)

Таким образом, решение состоит в том, чтобы просто переместить исходную точку навигационной панели в (0.0, 0.0) в ViewWillAppear.

self.navigationController.navigationBar.frame = CGRectMake(0.0, 0.0, self.navigationController.navigationBar.frame.size.width, self.navigationController.navigationBar.frame.size.height);
0 голосов
/ 12 января 2014

Проблема в том, что UINavigationController.view должен быть добавлен в вид сверху. Просто найдите лучший, и он будет отлично работать.

0 голосов
/ 16 января 2012

Проблема была решена путем исправления способа установки контроллера навигации.Вместо того, чтобы вставлять его в представление, которое было помещено в контроллер панели вкладок, контроллер navigaiton должен был быть помещен непосредственно в контроллер навигации.

advancedSearchFormVC = [[AdvancedSearchFormVC alloc] initWithNibName:@"AdvancedSearchForm" bundle:nil];
UINavigationController *searchNavController = [[UINavigationController alloc] initWithRootViewController:advancedSearchFormVC];

Это всего лишь один контроллер, который находится на контроллере панели вкладок,заменяя advancedSearchFormVC одновременно.Затем этот контроллер Nav был добавлен в массив контроллеров, которые были помещены в контроллер панели вкладок.

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

Спасибо за вашу помощь.

0 голосов
/ 16 января 2012

Поскольку вы добавляете advancedVC как подпредставление из self.view, оно добавляется внутри фрейма self.view, который, как я предполагаю, уже компенсирует строку состояния.

Вероятно, вы можете легко исправить это, добавив следующую строку:

nav.view.frame = self.view.frame;

Чуть выше этой строки:

self.view = nav.view;

-

ПрочееМысли

Я не знаком с вашими настройками, но self.view может не понадобиться вообще.Просто сделайте ваш advancedVC экземпляр rootViewController экземпляра UIWindow, который содержится в вашем делегате приложения.

...