【问题标题】:Getting rid of 1px shadow on UINavigationBar with custom background image使用自定义背景图像摆脱 UINavigationBar 上的 1px 阴影
【发布时间】:2015-01-21 08:09:18
【问题描述】:

我正在制作一个自定义UINavigationBar,其顶部条形图像具有黑色渐变。我怎样才能杀死底部的这个 1px 阴影边框?

我尝试了一些在这里找到的代码,但在我的设备上不起作用,只是模拟器。这是我尝试过的代码。

override func viewDidLoad() {
    super.viewDidLoad()
    UIApplication.sharedApplication().setStatusBarStyle(.LightContent, animated: false)
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(named:"TripNavigationBar2.png"), forBarPosition: .Any, barMetrics: .Default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
}

将它放入viewDidAppear:也不起作用。

有人可以解释为什么以及如何解决它吗?

【问题讨论】:

  • 可能是色调问题?您是否尝试过重置 navigationBar.tintColor ?
  • 我不这么认为@AmroShafie。现在尝试将其设置为 1 alpha 颜色,它仍然存在。
  • 嗨@OscarApeland,我可以用 iPhone 5s 重现这个问题,并有一个适合我的修复程序(请参阅下面的答案)。如果这没有帮助,请告诉我。

标签: ios xcode swift storyboard


【解决方案1】:

您拥有的代码非常好。

问题在于您使用的背景图片。您要么没有@2x 变体,要么没有将其添加到项目中。仅在 iPhone 5s 上的示例项目中使用您的图像时,我可以重现该问题。当我将调整大小的图片变体添加到项目中后,问题就消失了:

如果您将该图像添加到名为 TripNavigationBar2@2x.png 的项目中,问题应该会消失。

为了完整起见,我使用了UIImage(named:"TripNavigationBar2")(没有.png 后缀),但这应该没什么区别。

【讨论】:

  • 一点也不傻,我认为它是一个错误。很高兴我能帮上忙。
  • 我提交了一个雷达,让我们看看 Apple 的想法。希望这个问题和来自苹果的潜在解决方案将在未来拯救其他开发人员。
【解决方案2】:

可能最简单的方法是将 UIImage 分配给导航栏的 -shadowImage 属性。
我还是不知道 swift 所以我用 objC 写:

[[UINavigationBar appearance] setShadowImage:[UIImage  new]];

使用该方法,您是说每个导航栏都应该应用一个空图像作为 shadowImage。 真的很奇怪,它不起作用,你是不是用了那个方法?我通常在应用程序委托中调用它 didFinishLauching。
您也可以尝试从清晰的颜色创建 1px 方形图像并将其添加为阴影图像。这是一种使这成为可能的方法。

+ (UIImage *) imageWithColor:(UIColor*) color {
    CGRect rect = CGRectMake(0, 0, 1, 1);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, rect);
    UIImage *colorImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return colorImage;
}

【讨论】:

  • 感谢您的回答。代码显示在故事板管理的UIViewController 中的viewDidLoad 中,它是一个非常简单的视图控制器,由一个导航控制器布局拥有。我试过你说的(通过在 PS 中制作 1x1 透视图像),但也没有用。
  • 尝试将该代码放在 applicationDidFinishLauching 中,并确保不要在其他地方对不同的图像使用相同的方法
  • 这实际上也不起作用。这开始变得非常烦人,开始认为这可能是一个错误而不是编程错误,因为它在模拟器中工作。
  • 是的,这很可惜。我没有其他解决方案了,也许尝试检查不同的 iOS
【解决方案3】:

这应该适合你:

self.navigationController?.navigationBar.clipsToBounds

【讨论】:

  • 遗憾的是,这并没有解决问题。还有其他建议吗?
  • 其他人已经用尽了我能想到的所有可能性:/
【解决方案4】:

可能是半透明属性造成的。

默认值为YES。

[self.navigationController.navigationBar setTranslucent:NO];

试试看,希望对你有帮助。

【讨论】:

  • 这不起作用,因为我的图片是透明颜色的渐变。这样做只会使背景变白。
  • @OscarApeland 你能分享你正在使用的图像文件吗?
  • i.imgur.com/XexVf5l.png 它就在这里,即使它看起来不可见,它也只有 1px 宽。
【解决方案5】:

我在 iPad Air 上遇到了类似的问题,其 UIImage 背景在左侧下方留下了 1px 的线。我可以通过将 UIView 后面的背景颜色设置为像红色这样响亮的颜色来判断它是 UIImage。由于某种原因,UIImage 没有正确填充整个图像。

在我的情况下,只有当我使用的图像与放置在其中的视图的像素大小完全匹配时才会发生这种情况。为了解决这个问题,我编辑了图像并将其重新保存回相同的分辨率。不知何故,这为我解决了这个问题。完全不知道为什么,发现者在我编辑之前指出图像是正确的分辨率。

一个长镜头,但如果您的图像在高度、宽度或两者上恰好是 iPhone 6 的完美像素大小,那么值得一提。

【讨论】:

    【解决方案6】:

    我刚刚注意到 xcode 有一个新的调试工具,用于查看以 3D 形式展开的视图层次结构。假设模拟器显示您的问题,此调试工具可能有助于准确定位线路的来源。似乎只有在 iOS8 中运行时才有效。

    说明在这里:https://developer.apple.com/library/ios/recipes/xcode_help-debugger/using_view_debugger/using_view_debugger.html

    【讨论】:

      猜你喜欢
      • 2015-06-18
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      相关资源
      最近更新 更多