iOS 7 导航栏背景图片问题

Posted

技术标签:

【中文标题】iOS 7 导航栏背景图片问题【英文标题】:iOS 7 Navigationbar background image issue 【发布时间】:2014-02-18 12:58:46 【问题描述】:

我使用图像作为导航栏背景图像。要设置图像,我使用了以下代码:

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nav_logo_ios7.png"] forBarMetrics:UIBarMetricsDefault];

对于 iOS7,“nav_logo_ios7.png”图像大小为 768x64,对于 iOS6 和波纹管,我使用的图像大小为 768x44。

这在所有UIViewControllers 上运行良好。

在同一个项目中,我使用的是UIActivityViewController。在 iOS7 上的邮件撰写视图如下所示:

我该如何处理?

提前致谢。

【问题讨论】:

if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 7.0) // 加载 ios 7 图像 else // 加载 ios 6 图像 - 你需要按照上面的方法加载图像代码 @bhavyakothari 这就是我正在做的事情。 【参考方案1】:

您面临的问题是当 UIViewController 模态呈现时,状态栏不包含在 UINavigationBar 的高度中。

这意味着 64pt 图像不正确。

首先,官方检查设备运行的iOS版本的更好方法是执行以下操作:

if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)

    //handle iOS 7 Stuff

else

    //handle older iOS versions

有关详细信息,请查看 NSObjCRuntime.h 标头。

UINavigationBar 背景图像不应该是固定大小的图像,而应该是可拉伸的图像,例如可重复的图案,因此重新考虑未来的设计可能是一个想法......但是,如果您确实想继续使用自定义固定大小的图像,那么我有一个建议给你...

UINavigationController 允许您使用自定义 UINavigationBar 和 UIToolbar 类使用initWithNavigationBarClass:toolbarClass:... .

这意味着您将能够指定不同的背景图像,具体取决于您的导航控制器是否以模态方式呈现,例如:

UIImage *backgroundImage44pts = [UIImage imageNamed:@" ... "];
UIImage *backgroundImage64pts = [UIImage imageNamed:@" ... "];

if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)

    //handle iOS 7 Stuff
    [[UINavigationBar appearance] setBackgroundImage:backgroundImage44pts forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBarSubclass appearance] setBackgroundImage:backgroundImage64pts forBarMetrics:UIBarMetricsDefault];

else

    //handle older iOS versions
    [[UINavigationBar appearance] setBackgroundImage:backgroundImage44pts forBarMetrics:UIBarMetricsDefault];

需要注意的重要一点是 MFMailComposeViewController 不是 真正的 视图控制器,因此尝试使用自定义导航栏子类对其进行初始化可能行不通。这就是我使用自定义导航的原因所有非模态导航控制器的 bar 子类,而不是相反。

要注意的另一件事是,如果您的应用程序是通用的,则不存在模态视图(除非您有任何自定义),您不必担心这一点。

正如我之前所说... UINavigationBars 并不是真正设计为具有固定大小的背景图像(这就是为什么它如此难以实现的原因)所以如果你认为这个工作太复杂那么它可能会是一个好重新思考您的设计的想法。

最后一件事(我保证)... iOS 7 中的主要设计更改之一是让导航栏中的内容在状态栏下方流动。添加图像以防止这种情况并将其替换为对于 iOS 7 应用程序来说,纯白色背景似乎很奇怪。

【讨论】:

非常感谢这个解决方案。【参考方案2】:
//In `AppDelegate.m`

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0)
    
        [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nav_bg.png"] forBarMetrics:UIBarMetricsDefault];


        [[UINavigationBar appearance] setTitleTextAttributes:
         @
           UITextAttributeTextColor: [UIColor whiteColor],UITextAttributeTextShadowColor: [UIColor clearColor],UITextAttributeTextShadowOffset: [NSValue valueWithUIOffset:UIOffsetMake(0.0f, 1.0f)],UITextAttributeFont: [UIFont fontWithName:@"ArialMT" size:18.0f]
        ];


        CGFloat verticalOffset = -4;
        [[UINavigationBar appearance] setTitleVerticalPositionAdjustment:verticalOffset forBarMetrics:UIBarMetricsDefault];
    
    else
    
        [[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];

        // Uncomment to change the color of back button
        [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];

        // Uncomment to assign a custom backgroung image
        [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nav_bg_ios7.png"] forBarMetrics:UIBarMetricsDefault];

        // Uncomment to change the back indicator image

        [[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@""]];
        [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@""]];

        // Uncomment to change the font style of the title

        NSShadow *shadow = [[NSShadow alloc] init];
        shadow.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8];
        shadow.shadowOffset = CGSizeMake(0, 1);

        [[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:[UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], NSForegroundColorAttributeName,shadow, NSShadowAttributeName,[UIFont fontWithName:@"ArialMT" size:18.0], NSFontAttributeName, nil]];

        CGFloat verticalOffset = -4;
        [[UINavigationBar appearance] setTitleVerticalPositionAdjustment:verticalOffset forBarMetrics:UIBarMetricsDefault];
    

self.window.rootViewController = self.navigationController;

    [self.window makeKeyAndVisible];
    return YES;

【讨论】:

以上是关于iOS 7 导航栏背景图片问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7中导航栏的默认背景颜色是什么?

iOS 7 导航栏背景模糊效果在 iPhone 4 中不起作用

iOS 7 导航栏

如何在 iOS 7 上更改状态栏背景颜色和文本颜色?

如何在 iOS 7 或 6 中更改导航栏颜色?

在ios 7中将UI状态栏的背景颜色设置为黑色