1

У меня есть UINavigationController, который нажимает на другой UIViewController. В этом UIViewController я собираюсь показать UITableView в портретном режиме и другое представление в ландшафтном режиме.UIViewController не заполняет экран

Поэтому в моем представленииDidLoad я создаю UIView, а затем добавляю к нему 2 ViewControllers. Моя проблема в том, что когда он загружается, я получаю следующий белый край вверху. example

Я думаю, что это из-за (в моем шаге 3 ниже)

CGRect appFrame = [[UIScreen mainScreen] applicationFrame]; 
[[self view] setFrame:appFrame]; 

не возвращает полный экран, минус панель навигации. Это правильно? Если да, то как я могу заставить его вернуть полный размер, чтобы не было белого поля?

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Step 1 - Set up the tableDataView for vertical layout 
TableDataViewController *tableController = [[TableDataViewController alloc] init]; 
self.tableDataViewController = tableController; 
[tableController release]; 

// Step 2 - Set up the graphView for horizontal layout 
GraphViewController *graphController = [[GraphViewController alloc] 
    initWithNibName:@"GraphViewController" bundle:nil]; 
self.graphViewController = graphController; 
[graphController release]; 

// Step 3 - Get the screen size 
CGRect appFrame = [[UIScreen mainScreen] applicationFrame]; 
[[self view] setFrame:appFrame]; 

// Step 4 - Add the vertical view to the containerView 
//  and then add the containerView to this controller 
containerView = [[[UIView alloc] initWithFrame:appFrame] autorelease]; 
[[self view] addSubview:containerView];      
[containerView addSubview:[tableDataViewController view]]; 

// Step 5 - Add to the active view so we can test for it later 
activeView = [tableDataViewController view];  
} 

Большое спасибо

Майк

ответ

2

Я думаю, что у вас есть проблемы с смещениям каркаса. С включенной навигационной панелью выпрямитель, который вы получаете в appFrame, имеет смещение y 44.f (высота навигационной панели) - проверьте с NSLog и посмотрите, правда ли это.

Поскольку вы устанавливаете кадр вида, который будет размещен в начале координат, он должен иметь x и y истоки, установленные на ноль. Вы можете сделать это более безопасным способом, путем проверки

CGFloat navHeight = navController.navigationBarHidden ? 0 : 
    navController.navigationBar.frame.size.height; 

На самом деле я думаю, с помощью границы свойства [UIScreen] В начале может быть лучше общим решением. Он будет иметь правильное начало и размер, и вам не нужно будет проверять наличие панели навигации.

Проверьте, что происходит:

CGRect screenBounds = [[UIScreen mainScreen] bounds] 
NSLog(@"%@", NSStringFromCGRect(screenBounds)); 
CGRect screenFrame = [[UIScreen mainScreen] applicationFrame] 
NSLog(@"%@", NSStringFromCGRect(screenFrame)); 
+0

Когда я делать то, что вы предлагаете выше я получаю следующее: Screenbounds {{0,0}, { 320,480}}, Screenframe {{0,20}, {320,460}}. Поэтому в идеале мне нужно использовать ограничения [[UIScreen mainScreen]], чтобы получить максимальный размер. Однако я делаю это, и у меня все еще есть белый запас под панелью навигации. Это похоже на то, что он полностью игнорирует это. Майк. – hydev

+0

Я только что играл с этим, и кажется, что он полностью игнорирует то, что я установил ** CGRect appFrame **. Я просто сделал CGRectMake (0,0,20,20), и не было никакой разницы. TableController и graphController как-то ведут себя самостоятельно. – hydev

0

Есть пара вещей происходит. Прежде всего, frame описывает местоположение вида в своей системе координат супервизора.

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

Вы хотите, чтобы заполнить пользовательский вид, поэтому кадр containerView должно быть что-то вроде

CGRectMake(0.0, 0.0, self.view.bounds.width, self.view.bounds.height);

Смежные вопросы