UIViewController не заполняет экран - PullRequest
1 голос
/ 09 февраля 2011

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

Поэтому в моем viewDidLoad я создаю UIView, а затем добавляю к нему 2 ViewController. Моя проблема в том, что когда он загружается, я получаю следующий запас белого сверху. 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];    
 }

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

Mike

Ответы [ 2 ]

2 голосов
/ 09 февраля 2011

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

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

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

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

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

CGRect screenBounds = [[UIScreen mainScreen] bounds]
NSLog(@"%@", NSStringFromCGRect(screenBounds));
CGRect screenFrame = [[UIScreen mainScreen] applicationFrame]
NSLog(@"%@", NSStringFromCGRect(screenFrame));
0 голосов
/ 09 февраля 2011

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

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

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

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

...