使用自定义背景图像去除UINavigationBar上的1px阴影

时间:2015-01-21 08:09:18

标签: ios xcode swift storyboard

我正在使用带有黑色渐变的顶部条形图像制作自定义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:也无效。

有人可以解释为什么以及如何解决这个问题? only on sim?

6 个答案:

答案 0 :(得分:2)

你拥有的代码非常好。

问题是您正在使用的背景图片。您要么没有@2x变体,要么没有将其添加到项目中。我只能在iPhone 5s上的示例项目中使用您的图像时才能重现此问题。一旦我将图像的已调整大小的变体添加到项目中,问题就消失了:

Resized image

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

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

答案 1 :(得分:1)

最简单的事情可能是将UIImage分配给导航栏的-shadowImage属性。
我仍然不知道swift所以我写在objC:

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

使用该方法,您说每个导航栏应将空图像应用为shadowImage。 真的很奇怪,它不起作用,你是否把这种方法?我通常在app delegate 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;
}

答案 2 :(得分:1)

这应该适合你:

self.navigationController?.navigationBar.clipsToBounds

答案 3 :(得分:1)

可能是由半透明属性引起的。

默认值为YES。

[self.navigationController.navigationBar setTranslucent:NO];

试一试,希望它可以帮助你。

答案 4 :(得分:1)

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

在我的情况下,只有当我使用的图像与放置在其中的视图的精确像素大小匹配时才会发生。为了解决这个问题,我编辑了图像并将其保存回相同的分辨率。不知怎的,这为我解决了这个问题。绝对不知道为什么和finder在我编辑之前表明图像是正确的分辨率。

一个很长的镜头但是,如果您的图像偶然是iPhone 6的高度,宽度或两者的精确像素尺寸,那么值得一提。

答案 5 :(得分:0)

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

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