Проблемы с iPhone UINavigationController (UINavigationBar находится в неправильном месте) - PullRequest
3 голосов
/ 18 мая 2011

Я нахожусь в процессе внесения некоторых изменений в приложение, в том числе переход на интерфейс на основе навигации. В рамках этого изменения я написал контроллер представления, который содержит UINavigationController. Проблема в том, что по какой-то странной причине UINavigationBar и UIToolbar, управляемые UINavigationController, смещены на 20px вниз от того места, где они должны быть. Мне удалось создать следующий пример, демонстрирующий проблему:

// MyAppDelegate.m

@implementation MyAppDelegate
@synthesize window = _window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window.frame = [[UIScreen mainScreen] applicationFrame];
    [self.window makeKeyAndVisible];

    TestController* tc = [TestController new];
    [self.window addSubview:tc.view];

    return YES;
}

@end

// TestController.m

@implementation TestController

- (void)loadView
{
    self.view = [[UIView alloc] initWithFrame:CGRectZero];

    UINavigationController* navController = [UINavigationController new];
    navController.view.backgroundColor = [UIColor blueColor];
    [navController setToolbarHidden:NO animated:NO];

    [self.view addSubview:navController.view];
}

@end

Это дает следующий результат на моей машине:

Shot of example

Как вы можете видеть, элементы управления на 20px ниже того уровня, на котором я их ожидал. Я попробовал почти все, что я могу придумать (различные комбинации wantsFullScreenLayout, autoresizesSubviews и т. Д.) Без положительного эффекта. Это также не имеет ничего общего с программной ошибкой в ​​строке состояния (как, по-видимому, имеет место в большинстве других примеров, с которыми я сталкивался), поскольку я ни в коем случае не связываюсь со строкой состояния. Это происходит с или без корневого контроллера представления в навигационном контроллере - если он есть, его содержимое также смещается на 20 пикселей вниз (поэтому они фактически находятся в правильном месте относительно панели навигации и панели инструментов).

Любая помощь высоко ценится!

РЕДАКТИРОВАТЬ: После небольшого исследования кажется, что удаление строки self.window.frame = [[UIScreen mainScreen] applicationFrame];, кажется, исправляет положение панели навигации, панели инструментов и содержимого. Тем не менее, теперь некоторые другие представления в приложении находятся не в том месте (вверху строки состояния). Насколько я понимаю, что строка обычно рекомендуется, чтобы убедиться, что окно имеет правильный размер?

Ответы [ 2 ]

1 голос
/ 28 мая 2011

Как упоминалось в моем редактировании, удаление строки self.window.frame = [[UIScreen mainScreen] applicationFrame];, похоже, исправило 95% моих проблем.Мне удалось придумать подход, чтобы исправить остальные 5%, используя тот же цвет фона для моего окна и оставшиеся виды имеют проблемы, но я не могу сказать, что в восторге от этого решения - мне не нужносделайте это.

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

0 голосов
/ 18 мая 2011

UINavigationController не подходит для использования в качестве подпредставления;как вы заметили, он часто оставляет место для строки состояния, даже если на самом деле не находится под строкой состояния.Если вы не пытаетесь написать свой собственный контроллер представления контейнера, вам следует переработать код, чтобы вообще не добавлять представление контроллера представления в качестве подпредставления.

Тем не менее, мне повезло, исправивустановив wantsFullScreenLayout в NO на UINavigationController, чтобы он не оставлял место для строки состояния.Конечно, вы захотите сделать это сразу после выделения, до того, как будет запущен loadView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...