似乎在 iOS 6 中,即使您设置了自定义背景图像,导航栏也会自动添加阴影。我很确定 iOS 5 不是这种情况,因为当我在 iOS 5 和 6 sim 中测试相同的代码时,阴影出现在 iOS 6 中而不是 5 中。
有人对这个有了解吗?或者如何启用/禁用它?
似乎在 iOS 6 中,即使您设置了自定义背景图像,导航栏也会自动添加阴影。我很确定 iOS 5 不是这种情况,因为当我在 iOS 5 和 6 sim 中测试相同的代码时,阴影出现在 iOS 6 中而不是 5 中。
有人对这个有了解吗?或者如何启用/禁用它?
把它放在你的 AppDelegate
[[UINavigationBar appearance] setShadowImage:[UIImage new]];
// is IOS 7 and later
[[UINavigationBar appearance] setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
这就是为我做的。希望能帮助到你!
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)
我知道这已经通过上面更复杂的答案解决了,但这是我将阴影隐藏在导航栏下的最快和最简单的方法。
self.navigationController.navigationBar.clipsToBounds = YES;
Apple 开发文档中关于该shadowImage
属性的注释:
讨论:默认值为nil,对应默认的阴影图像。当非零时,此属性表示要显示的自定义阴影图像而不是默认值。要显示自定义阴影图像,还必须使用 setBackgroundImage:forBarMetrics: 方法设置自定义背景图像。如果使用默认背景图像,则无论此属性的值如何,都将使用默认阴影图像。
因此,要使用 nil UIImage hack,您还必须设置自定义导航栏背景图像。这也可以是一个 nil 图像,这会产生一个漂亮的平坦、干净的“地铁”风格导航栏:
[[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,则呈现解决方案的方式会导致添加属性。
一个更好的方法来做一些依赖于属性或方法存在的事情是:
if ([self.navigationController.navigationBar
respondsToSelector:@selector(shadowImage)]) {
self.navigationController.navigationBar.shadowImage = [[[UIImage alloc] init] autorelease];
}
有两种可能的解决方案,其中第二种在其他答案中提到。
实现以下代码:
// 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];
没有工作,我找到了一种简单可行的方法来消除UINavigationBar
iOS 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 像素制作了自己的阴影 :)
我无法发表评论,所以我会在这里添加我的信息。
也许上述建议在测试版中有效,但现在似乎并非如此。
self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];
以上不起作用,上面任何其他类似的答案也不起作用。我都试过了。
剪裁到边界确实有效,但没有给出我想要的结果,因为我希望其他视图挂在导航栏之外。
当我试图让导航栏在 iOS6 和 iOS7 之间看起来相同时,我遇到了这个 SO 问题。
我发现有效的答案只是使用:
NSMutableDictionary *titleBarAttributes = [NSMutableDictionary dictionaryWithDictionary: [[UINavigationBar appearance] titleTextAttributes]];
[titleBarAttributes setValue:[NSNumber numberWithInt:0] forKey:UITextAttributeTextShadowOffset];
[[UINavigationBar appearance] setTitleTextAttributes:titleBarAttributes];
即:将阴影偏移设置为零。
替代方法如何:
UINavigationBar.appearance().barStyle = .Black
对于深色导航栏,iOS 不显示阴影。
我有同样的问题,我已经通过以下方式解决了它:
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
在 Swift 3.0 中,这看起来像这样
UINavigationBar.appearance().shadowImage = UIImage ()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)