2012-05-03 2 views
1

У меня массивная проблема, и я действительно надеюсь, что вы можете помочь мне здесь ... Я очень потерял в данный момент :(Принуждение положения макета и размера в IOS Superviews

У меня есть проект, который выполняется с помощью MainWindow.xib. В моем делете делегата приложения я проверяю ориентацию устройства и загружаю соответствующий файл NIB с разными макетами (субвью) на основе ориентации. Вот код для проверки ориентации:

-(void)checkTheOrientation 
{ 
    if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight) 
    { 
     viewController = [[[MyViewController alloc] initWithNibName:@"MyWideViewController" bundle:nil] autorelease]; 
     NSLog(@"Landscape = MyWideViewController"); 
    } 
    else if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown) 
    { 
     viewController = [[[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil] autorelease]; 
     NSLog(@"Portrait = MyViewController"); 
    } 
} 

Работает так, как ожидалось, и в Пейзаже или в портрете Я загружаю правильные виды. Портретный портрет загружается отлично, но пейзаж Пейзаж загружается с толстым черным краем слева, как будто это x & y позиции не установлены на 0 & 0 соответственно.

Вот вид портрет: http://uploads.socialcode.biz/2f25352B0e3x3z2t2z21 Вот вид пейзаж с ошибкой: http://uploads.socialcode.biz/1G2k3T012d1z0Y1U2q1k

В файле MyViewController.m У меня есть грубое исправление, чтобы получить проклейки сделано правильно, чтобы избежать этой большой черной полосы на левый. Вот код для этого:

- (void) performLayout { 
    // Ensure the main view is properly placed 
    NSInteger MaxSizeHeight, MaxSizeWidth; 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    { 
     MaxSizeHeight = 1024; 
     MaxSizeWidth = 768; 
    } 
    if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight) { 
     CGRect mainViewFrame = [[self view] frame]; 
     float width = mainViewFrame.size.width; 
     mainViewFrame.size.width = mainViewFrame.size.height; 
     mainViewFrame.size.height = width; 
     mainViewFrame.origin.x = 0; 
     mainViewFrame.origin.y = 0; 
     [[self view] setFrame:mainViewFrame]; 
    } else { 
     CGRect mainViewFrame = [[self view] frame]; 
     mainViewFrame.origin.x = MaxSizeWidth - mainViewFrame.size.width; 
     mainViewFrame.origin.y = MaxSizeHeight - mainViewFrame.size.height; 
     [[self view] setFrame:mainViewFrame]; 
    } 

    // Ensure the content view is properly placed 
    CGRect contentFrame = [mainContentView frame]; 
    if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight) 
    { 
     contentFrame.size.width = MaxSizeHeight; 
     contentFrame.size.height = MaxSizeWidth; 
    } 
    contentFrame.origin.x = 0; 
    contentFrame.origin.y = 44; 
    [mainContentView setFrame:contentFrame]; 

    // Ensure the content subviews are properly placed 
    contentFrame.origin.y = 0; 
    for (UIView *contentView in [mainContentView subviews]) { 
     [contentView setFrame:contentFrame]; 
    } 
} 

Проблема этого метода состоит в том, что это просто очень плохо хак, и это на самом деле не решить мою проблему. Когда он загружается в Landscape, он теперь изменяет размеры и позиционирует subview на 1024x768,0,0, но любые дополнительные подпункты, которые я загружаю через другие NIB, имеют одинаковую проблему.

Что я хотел бы знать, так это как я могу установить, чтобы основной вид ландшафта был 1024x768 позицией 0 & 0, не пытаясь взломать это вместе и продолжать выполнять селектор performLayout? На данный момент существует много несогласованности с этим, поскольку хак не на самом деле устанавливает правильность выбора супервизора, а скорее как subviews, которые я загружаю поверх супервизора.

Я думал, что, возможно, простое исправление, подобное этому, может решить проблему супервизора, но, увы, это не так: window.frame = CGRectMake (0, 0, 1024, 768);

Я просто хочу, чтобы мой основной надзор был размещен и правильно распределен при загрузке, а затем супервизоры просто загружают в нужное место. Пожалуйста, помогите мне здесь ???

+0

Небольшой комментарий (не связанный с ответом): это неправильный способ сделать это, лучший способ - установить правильное поведение из xib-файла. Я использовал тот же самый подход, и у меня была ужасная проблема с большими приложениями. –

+0

@MarcoPace У меня никогда не было проблем с файлами XIB, но независимо от того, что я делаю в IB, ничто не меняет макет для меня. Я просто волнуюсь, что, возможно, MainWindow.xib (который не может быть изменен из режима Portrait) является основной причиной проблемы. Есть ли у вас какие-либо предложения, которые я могу попробовать? – justinhartman

ответ

0

Во-первых, UIView имеет метод с именем -layoutSubviews, который вы можете переопределить, чтобы позиционировать подпункты, как вам нравится. Он будет вызываться, когда представление будет сначала загружено, и снова перед рисованием, если вы когда-нибудь отправите ему сообщение -setNeedsLayout.

Во-вторых, вы должны иметь возможность правильно установить эти позиции в файле .xib или раскадровки. Выберите свой основной вид в его .xib-файле и проверьте его положение в инспекторе размеров. Кроме того, убедитесь, что для представления установлено значение Пейзажная ориентация в инспекторе атрибутов. Если все правильно, то происходит что-то еще. Чтобы упростить задачу, создайте новый проект в Xcode без ничего, кроме пустого представления в альбомной ориентации. Я только что сделал, и проблем с позицией нет. Это то, что вы хотите в своем реальном приложении, так что выясните, что происходит в вашем реальном приложении, чтобы повлиять на позицию представления, чего не происходит в вашем новом примере приложения.

+0

Калеб, спасибо за комментарий. У меня корректно выполняется layoutSubviews (проверено с помощью NSLog), но у меня все еще есть странное черное пространство слева. Вот мой код: – justinhartman

+0

вот код, который у меня есть (извините, но Stack Overflow продолжает отправлять мои комментарии, когда я нажимаю enter) ... http://pastie.org/3855031 – justinhartman

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

  • Нет связанных вопросов^_^