Панель навигации от UINavigationController не расположена правильно - PullRequest
0 голосов
/ 26 мая 2010

Итак, моя программа для iPad имеет контроллер представления с псевдо-разделением (тот, который я реализовал, а не базовый SDK), и некоторое время назад он работал правильно. Он имеет базовый макет (UINavController для мастера, контроллер представления контента для подробностей справа), но у меня он есть, чтобы главный вид не исчезал при повороте в портретное представление.

Недавно я добавил в UITabBarController, чтобы он содержал весь разделенный вид, из-за чего панель навигации стала шаткой, в то время как все остальные представления расположены нормально. Кроме того, панель навигации неправильно позиционируется только при запуске программы, когда iPad находится в горизонтальной или перевернутой ориентации. Если все начинается в портрете, все в порядке.

Примеры изображений можно найти здесь: http://profile.imageshack.us/user/Pzychotix

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

Соответствующий код:

RootViewController.m:
- (void)loadView {
navController = [[NavigationBreadcrumbsController_Pad alloc] init];

ABTableViewController_Pad * tableViewController = [[ABTableViewController_Pad alloc] initWithNibName:@"ABTableView"];

master = [[UINavigationController_Pad alloc] initWithRootViewController:tableViewController];
[tableViewController release];

// Dummy blank UIViewcontroller
detail = [[UIViewController alloc] init];
detail.view = [[[UIView alloc] init] autorelease];
[detail.view setBackgroundColor:[UIColor grayColor]];

self.view = [[[UIView alloc] init] autorelease];
self.view.backgroundColor = [UIColor blackColor];
[self positionViews];
[self.view addSubview:navToolbarController.view];
[self.view addSubview:master.view];
[self.view addSubview:detail.view];
}


// Handles the respositioning of view into it's current orientation
-(void)positionViews{

CGFloat tabBarOffset = 0;

if(self.tabBarController){
    tabBarOffset = self.tabBarController.tabBar.frame.size.height;
}

if(self.interfaceOrientation == UIInterfaceOrientationPortrait || self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
    self.view.frame = CGRectMake(0, 0, 768, 1004);
    navController.view.frame = CGRectMake(0,0,768,44);
    //adjust master view
    [master.view setFrame:CGRectMake(0, 44, 320, 1024 - 44 - 20 - tabBarOffset)];

    //adjust detail view
    [detail.view setFrame:CGRectMake(321,44, 448, 1024 - 44 - 20 - tabBarOffset)];
}
// Landscape Layout
else{
    self.view.frame = CGRectMake(0, 0, 748, 1024);
    navToolbarController.view.frame = CGRectMake(0,0,1024,44);
    //adjust master view
    [master.view setFrame:CGRectMake(0, 44, 320, 768 - 44 - 20 - tabBarOffset)];

    //adjust detail view
    [detail.view setFrame:CGRectMake(321,44, 1024 - 320, 768 - 44 - 20 - tabBarOffset)];
}

}

1 Ответ

0 голосов
/ 27 мая 2010

Ну, я нашел решение, хотя я все еще чешу голову, почему оно работает.

По сути, я вызвал layoutIfNeeded на моем UINavigationController, и это все исправило. Чего я не понимаю, так это того, почему он работал раньше, или почему мне нужно было бы вызывать layoutIfNeeded, поскольку я предполагал, что setFrame будет автоматически иметь дело с разметкой любых подпредставлений контроллеров.

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