навигационное фоновое изображение Bar на iPad с iOS 5 в альбомном режиме - PullRequest
3 голосов
/ 13 октября 2011

Я борюсь с этим какое-то время, и я не могу найти кого-либо с подобной проблемой. Моя проблема в том, что фоновое изображение, которое загружается для iPad в альбомной ориентации, не является правильным (оно загружает портретную версию изображения). На iphone или iPod он работает как положено.

Код, который я использую в файле AppDelegate, выглядит следующим образом:

if ( [[[UIDevice currentDevice] systemVersion] floatValue] >= 5.0 ) {
    // Create resizable images
    UIImage *gradientImageP = [[UIImage imageNamed:@"header"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
    UIImage *gradientImageL = [[UIImage imageNamed:@"header-Landscape"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
    [[UINavigationBar appearance] setBackgroundImage:gradientImageP
                                       forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBar appearance] setBackgroundImage:gradientImageL
                                       forBarMetrics:UIBarMetricsLandscapePhone];
    [[UINavigationBar appearance] setBarStyle:UIBarStyleBlackTranslucent];
    [[UINavigationBar appearance] setTintColor:[UIColor colorWithRed:0 green: 0 blue:0  alpha:1]];
}

Проблема в этой строке?

[[UINavigationBar appearance] setBackgroundImage:gradientImageL
                                   forBarMetrics:UIBarMetricsLandscapePhone];

Мои имена изображений следующие:

  • заголовок-пейзаж ~ iphone.png
  • header-Landscape@2x~iphone.png
  • заголовок-пейзаж ~ ipad.png
  • заголовок ~ iphone.png
  • header@2x~iphone.png
  • заголовок ~ Ipad

Редактировать: Скриншоты проблемы на панели навигации:

Кто-нибудь с этой проблемой? Я открыт для идей о том, как решить эту проблему, tkz

Ответы [ 4 ]

3 голосов
/ 05 сентября 2012

Просто используйте этот код:

[[UINavigationBar appearance] setBackgroundImage:[[UIImage imageNamed:@"ipad-menubar.png" ] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10)] forBarMetrics:UIBarMetricsDefault];
1 голос
/ 02 ноября 2011

Работает ли приложение ~ iPad для портретного режима?

Это не для меня.Вам также нужно указать ~ iPhone, чтобы заставить его работать?

Я получил отдельное изображение для iPad, выполнив

- (void)customizeAppearance {

    if ([[UINavigationBar class]respondsToSelector:@selector(appearance)]) {

        // Create resizable images for iphone
        UIImage *navbarImage44 = [[UIImage imageNamed:@"navbar_bg_portrait"] 
                                  resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
        UIImage *navbarImage32 = [[UIImage imageNamed:@"navbar_bg_landscape"] 
                                  resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];

        // Overide for iPad
        // In theory navbar_bg_landscape~iPad should work
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
            //use iPad specific image extending last pixel for landscape mode
            navbarImage44 = [[UIImage imageNamed:@"navbar_bg_portrait~iPad"] 
                                      resizableImageWithCapInsets:UIEdgeInsetsMake(0, 767, 0, 0)];
       }

        // Set the background image for *all* UINavigationBars
        [[UINavigationBar appearance] setBackgroundImage:navbarImage44 
                                           forBarMetrics:UIBarMetricsDefault];
        // Never called on iPad, used for landscape on iPhone
        [[UINavigationBar appearance] setBackgroundImage:navbarImage32 
                                           forBarMetrics:UIBarMetricsLandscapePhone];
    }
}

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

1 голос
/ 13 декабря 2011

Мне не удалось управлять методом внешнего вида, работающим на iPad с ротацией.Несмотря на то, что размер рамки панели навигации изменен правильно, изображение не меняется.В конце концов я подключил методы viewWillAppear:animated и willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration всех своих контроллеров, чтобы просто вызывать setBackgroundImage: с правильной версией на iPad.Ужасно, но работает.

Возможно, об этой ошибке стоит сообщить Apple.Имена самих определений также сбивают с толку, UIBarMetricsLandscapePhone не имеет смысла на iPad, и ориентация приложения по умолчанию может быть горизонтальной!

0 голосов
/ 15 октября 2011

Я думаю, вам нужно сделать что-то вроде этого:

UIImage *gradientImageP;
UIImage *gradientImageL;

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    //use iPhone specific images
    gradientImageP = [[UIImage imageNamed:@"header~iphone.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
    gradientImageL = [[UIImage imageNamed:@"header-Landscape~iphone.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    //use iPad specific images
    gradientImageP = [[UIImage imageNamed:@"header~Landscape~ipad.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];

}
...