如何禁用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]; }
有两种可能的解决办法,其他的答案中提到了其中的第二种。
- 在导航栏背景图像的底部添加一个透明像素,使其高度为45pt。 这将禁用iOS 6中的阴影。
-
实现以下代码:
// 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)