如何禁用iOS 6中的导航栏阴影与自定义背景图像的导航栏?

看起来在iOS 6中,即使设置自定义背景图像,导航栏也会自动添加阴影。 我敢肯定,iOS 5的情况并非如此,因为当我在iOS 5和6 sim上testing相同的代码时,阴影出现在iOS 6中,但不是5。

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

把它放在你的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) 

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

 self.navigationController.navigationBar.clipsToBounds = YES; 

请注意,关于shadowImage属性的主题的Apple开发文档:

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

因此,要使用零UIImage黑客你还必须设置一个自定义的导航栏背景图像。 这也可以是一个零图像,这将导致一个漂亮的平坦,干净的“地铁”风格的导航栏:

 [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]]; [[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault]; 

你也可以试试这个:

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

控制器是一个UINavigationController。

一般来说,非NDA侵权的答案是:

如果您不想要某个图层突出显示某个图层,请将图层遮罩到其边界。

 [self.layer setMasksToBounds:YES]; 

如果不能自行工作,请将高度显式设置为44(对于iPhone上的横向为32)。

将shadowImage设置为空图像是行得通的,但是,如果操作系统早于iOS 6,则解决scheme的显示方式会导致添加属性。

做一个依赖于财产或方法的存在的更好的方法是:

 if ([self.navigationController.navigationBar respondsToSelector:@selector(shadowImage)]) { self.navigationController.navigationBar.shadowImage = [[[UIImage alloc] init] autorelease]; } 

有两种可能的解决办法,其他的答案中提到了其中的第二种。

  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

由于self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init]; 没有工作,我发现一个简单和可行的方法来删除在iOS 6和iOS 5的UINavigationBar的阴影。希望有需要的人可以看到这个职位。

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

然后,只需使用[[UINavigationBar appearance] setBackgroundImage: ...] ,你会发现阴影被replace为1像素。 干杯!

顺便说一句,我发现Twitter做了完全一样的事情,如果你解压Twitter.ipa并看看bg_nav_bar_events_dark.png ,尺寸是320×47。 他们为3个像素做了自己的影子:)

我不能评论,所以我会在这里添加我的信息。

也许上述build议在testing版中起作用,但现在看来并不是这样。

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

上述不起作用,上面的其他类似的答案也没有。 我已经全部尝试过了。

剪切到界限不起作用,但没有给我想要的结果,因为我希望其他视图挂在导航栏外。

我遇到这个问题,当试图让导航栏看起来相同的iOS6和iOS7。

我find的答案只是简单地使用:

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

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

我有同样的问题,我已经解决了以下问题:

 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 

另一种方式如何:

UINavigationBar.appearance().barStyle = .Black

对于黑暗的导航栏iOS不显示阴影。

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

 UINavigationBar.appearance().shadowImage = UIImage () UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)