50

似乎在 iOS 6 中,即使您设置了自定义背景图像,导航栏也会自动添加阴影。我很确定 iOS 5 不是这种情况,因为当我在 iOS 5 和 6 sim 中测试相同的代码时,阴影出现在 iOS 6 中而不是 5 中。

有人对这个有了解吗?或者如何启用/禁用它?

4

13 回答 13

141

把它放在你的 AppDelegate

[[UINavigationBar appearance] setShadowImage:[UIImage new]];
// is IOS 7 and later
[[UINavigationBar appearance] setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];

这就是为我做的。希望能帮助到你!

带有评论更新的 Swift 版本

    UINavigationBar.appearance().shadowImage = UIImage()
    UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)
于 2012-11-09T19:12:59.910 回答
57

我知道这已经通过上面更复杂的答案解决了,但这是我将阴影隐藏在导航栏下的最快和最简单的方法。

self.navigationController.navigationBar.clipsToBounds = YES;
于 2012-10-14T13:34:13.597 回答
25

Apple 开发文档中关于该shadowImage属性的注释:

讨论:默认值为nil,对应默认的阴影图像。当非零时,此属性表示要显示的自定义阴影图像而不是默认值。要显示自定义阴影图像,还必须使用 setBackgroundImage:forBarMetrics: 方法设置自定义背景图像。如果使用默认背景图像,则无论此属性的值如何,都将使用默认阴影图像。

因此,要使用 nil UIImage hack,您还必须设置自定义导航栏背景图像。这也可以是一个 nil 图像,这会产生一个漂亮的平坦、干净的“地铁”风格导航栏:

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
        [[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
于 2013-04-25T09:19:20.053 回答
19

你也可以试试这个:

controller.navigationBar.shadowImage = [[[UIImage alloc] init] autorelease];

控制器是一个 UINavigationController。

于 2012-09-18T10:09:36.353 回答
7

一般,非 NDA 侵权答案:

如果您不希望某些东西从图层中伸出,请将图层蒙版到其边界。

[self.layer setMasksToBounds:YES];

如果它本身不起作用,请将高度明确设置为 44(或 iPhone 上的横向 32)。

于 2012-07-08T18:26:03.740 回答
6

将 shadowImage 设置为空图像确实有效,但是,如果操作系统早于 iOS 6,则呈现解决方案的方式会导致添加属性。

一个更好的方法来做一些依赖于属性或方法存在的事情是:

if ([self.navigationController.navigationBar
respondsToSelector:@selector(shadowImage)]) {
self.navigationController.navigationBar.shadowImage = [[[UIImage alloc] init] autorelease];
}
于 2012-10-31T17:27:15.867 回答
3

有两种可能的解决方案,其中第二种在其他答案中提到。

  1. 在导航栏背景图像的底部添加一个透明的像素,使其高度为 45pt。这将禁用 iOS 6 中的阴影。
  2. 实现以下代码:

    // Omit the conditional if minimum OS is iOS 6 or above
    if ([UINavigationBar instancesRespondToSelector:@selector(setShadowImage:)]) {
        [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
    }
    

来源:iOS 上的高级外观定制,@27:15

于 2013-01-26T00:11:20.030 回答
2

由于self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];没有工作,我找到了一种简单可行的方法来消除UINavigationBariOS 6和iOS 5中的阴影。希望有需要的人可以看到这篇文章。

您所要做的就是准备一张高度比导航栏高度大 1 像素的背景图像(例如,默认 UINavigationBar 为 320×45,当然 2x 为 640×90)。

然后只需使用[[UINavigationBar appearance] setBackgroundImage: ...],您会发现阴影被那 1 个像素所取代。干杯!

顺便说一句,我发现 Twitter 也做了同样的事情,如果你解压缩Twitter.ipa并查看bg_nav_bar_events_dark.png,大小是 320×47。他们为 3 像素制作了自己的阴影 :)

于 2013-09-13T07:39:19.610 回答
1

我无法发表评论,所以我会在这里添加我的信息。

也许上述建议在测试版中有效,但现在似乎并非如此。

self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];

以上不起作用,上面任何其他类似的答案也不起作用。我都试过了。

剪裁到边界确实有效,但没有给出我想要的结果,因为我希望其他视图挂在导航栏之外。

于 2012-10-30T21:16:52.003 回答
1

当我试图让导航栏在 iOS6 和 iOS7 之间看起来相同时,我遇到了这个 SO 问题。

我发现有效的答案只是使用:

    NSMutableDictionary *titleBarAttributes = [NSMutableDictionary dictionaryWithDictionary: [[UINavigationBar appearance] titleTextAttributes]];
    [titleBarAttributes setValue:[NSNumber numberWithInt:0] forKey:UITextAttributeTextShadowOffset];
    [[UINavigationBar appearance] setTitleTextAttributes:titleBarAttributes];

即:将阴影偏移设置为零。

于 2013-10-16T18:26:15.017 回答
1

替代方法如何:

UINavigationBar.appearance().barStyle = .Black

对于深色导航栏,iOS 不显示阴影。

于 2015-09-29T08:29:43.513 回答
0

我有同样的问题,我已经通过以下方式解决了它:

CustomNavBar *navBar = (CustomNavBar *)self.navigationController.navigationBar;
        [navBar setBackgroundImage:[UIImage imageNamed:@"navigation_bar_gray.png"] forBarMetrics:UIBarMetricsDefault];
        navBar.shadowImage = [[UIImage alloc]init]; // this is what acctually removed the shadow under navigation bar 
于 2012-10-04T07:18:59.030 回答
0

在 Swift 3.0 中,这看起来像这样

UINavigationBar.appearance().shadowImage = UIImage ()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
于 2016-10-24T08:50:24.287 回答