在横向模式下使用iOS 5的iPad上的navigationBar背景图像

时间:2011-10-13 03:45:09

标签: objective-c ipad uinavigationbar landscape ios5

我挣扎了一段时间,我找不到任何有相关问题的人。 我的问题是,在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 个答案:

答案 0 :(得分:3)

只需使用此代码:

[[UINavigationBar appearance] setBackgroundImage:[[UIImage imageNamed:@"ipad-menubar.png" ] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10)] forBarMetrics:UIBarMetricsDefault];

答案 1 :(得分:1)

追加~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];
    }
}

但对于横向模式,它使用纵向图像并重复最后一个像素列来完成缺失部分,因此对您的问题没有好处,尽管这可能对其他读者有用。

答案 2 :(得分:1)

我无法通过旋转来管理适用于iPad的外观方法。即使导航栏的框架正确调整大小,图形也不会改变。最后,我将所有控制器的viewWillAppear:animatedwillAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration方法联系起来,只需在iPad上使用正确的版本调用setBackgroundImage:即可。丑陋,但有效。

这可能是值得向Apple报告的错误。定义本身的名称也令人困惑,UIBarMetricsLandscapePhone在iPad上没有意义,您的默认应用方向可能是风景!

答案 3 :(得分:0)

我认为你需要做这样的事情:

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)];

}