UINavigationBar 外观背景图像在 iOS 7.1 中重复和模糊

Posted

技术标签:

【中文标题】UINavigationBar 外观背景图像在 iOS 7.1 中重复和模糊【英文标题】:UINavigationBar appearance background image duplicated and blurred in iOS 7.1 【发布时间】:2014-03-20 10:46:46 【问题描述】:

我认为现有项目和 ios7.1 存在一个有趣的问题。我的代码正常工作和执行;自从在我的设备上更新 XCode 和我的 iOS 后,我遇到了一个问题,在该项目的导航栏中使用的透明背景图像现在被渲染了两次,一次是正确的大小,然后再次被放大和模糊。该代码仅通过应用程序委托中的[UINavigationBar appearance] api 添加图像。为了检查这不是我的代码的特定错误,我使用主详细信息默认值创建了一个默认 xcode 项目,将其设置为仅 iPhone,添加了一些新创建的图像并使用应用程序委托中的相同调用进行设置。这个项目有同样的问题,在 github 上:

UINavigationBarBug github source

这是 imo 的相关代码块:

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

    // Override point for customization after application launch.
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"TLS.png"]
                                       forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBar appearance] setBarTintColor:RGB(233, 155, 20)];
    [[UINavigationBar appearance] setTintColor:RGB(245, 245, 245)];

    return YES;

问题截图:

看看我在这里所做的过渡文档应该没问题,44 点高的导航栏应该水平而不是垂直缩放。我也很确定这个问题在更新之前从未发生过(在将代码上传到苹果进行审查之前,内部 QA 会发现它)。

有两件事可以解决它:

1) 使用非透明图像,如果仍然存在问题,则第二次加载“正确”图像,并且由于缺乏透明度覆盖了错误渲染的图像。

2) 改用 66 点高的导航栏(在顶部透明部分为 TLS-ios7 的项目中可用),更改应用程序委托中的代码以使用它来解决问题。

谁能告诉我这里发生了什么?这是一个错误,是我的错吗,是否有一些文档部分告诉我为什么会这样?

谢谢!

** 更新:我最近发现一个 iPad 还在运行 iOS 7.0,没有出现这个问题。 **

【问题讨论】:

我只是想问一下,但有没有可能这只是显示在透明图像后面的导航栏的标题文本? 没有设置标题,但是是一个足够公平的问题。 @Diziet 有什么更新吗?我遇到了同样的问题 @Diziet 你有什么解决办法吗?我在 iPad 非视网膜设备中面临同样的问题。在视网膜设备上它工作正常。 我已使用非透明导航栏图像重新提交应用程序,并向 Apple 提交了错误。 【参考方案1】:

我的应用也遇到了类似的问题。我通过将 UINavigationBar 的“半透明”设置为 NO 来解决它。

[self.navigationController.navigationBar setTranslucent:NO];

【讨论】:

这似乎对我不起作用,使用我链接到的示例项目对您有用吗?我已经通过情节提要并使用您提到的代码进行了尝试。【参考方案2】:

您可以通过定义左大写和顶大写来禁用图像拉伸。 这是一个 Swift 3 解决方案:

let navbarImage = image.stretchableImage(withLeftCapWidth: 1, topCapHeight: 1)
UINavigationBar.appearance().setBackgroundImage(navbarImage, for: .default)

之前的例子:

在修复之后:

【讨论】:

【参考方案3】:

我刚刚在我的错误报告之后收到了这个... tl;dr 这是我提供的图片高度不正确:

iOS 7.1 的解决方法是指定具有非零插图的可调整大小的图像。如果图像大小不合适,UINavigationBar 会在内部平铺您的图像,这基本上就是这里发生的情况——因为图像不够高(导航栏位于顶部,所以图像需要 64pt 高而不是 44pt ) 它会被平铺。如果您将其设置为拉伸并配置 cap insets,使其仅拉伸均匀的像素,您应该能够避免此问题。

【讨论】:

【参考方案4】:

我遇到了类似的问题,结果证明我在资产目录中没有正确的图像资产。我只有视网膜资产,但是当我导入时,它们进入资产目录中的 1x 框 - 将它们移动到 2x 框为我修复了我的导航栏。

【讨论】:

【参考方案5】:

我有一个类似的问题,我有一个透明背景的标志。身高还不错。添加在彩色背景中,问题停止了。

【讨论】:

以上是关于UINavigationBar 外观背景图像在 iOS 7.1 中重复和模糊的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationBar 和新的 iOS 5+ 外观 API - 如何提供两个背景图像?

UINavigationBar 背景图片不随旋转而改变

UINavigationBar 外观 addSubview 在 iOS 8 中不起作用

根据横向/纵向更改 UINavigationBar 背景?

删除 UINavigationBar 上的背景图像

如何使用自定义背景图像从 UINavigationBar 和 UIToolbar 中删除圆角?