如何在iOS 7中去除UINavigationBar的内阴影?

21

内阴影示例

我试图将导航栏放在另一个导航栏下面,使其看起来像一个高导航栏。但在iOS 7中,UINavigationBar现在在顶部和底部都有内阴影。我真的需要将其删除。但我没有找到任何解决方案。它看起来像阴影是预先渲染的,但实际上它会在视图出现后约0.4秒慢慢出现。

我尝试了几乎所有的方法,但阴影仍然存在。我使用这段代码删除了栏下面的水平线:

for (UIView *view in [[[self.navigationController.navigationBar subviews] objectAtIndex:0] subviews]) {
     if ([view isKindOfClass:[UIImageView class]]) view.hidden = YES;
}

但是我不知道如何去掉这个阴影。非常感谢!

我尝试了以下方法:

[self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]];

但是这段代码甚至不能移除条形下方的水平线(这个方法需要自定义背景图像)。我使用的是Xcode版本5.0(5A11365x)。


iOS 7 is the seventh major release of the iOS mobile operating system developed by Apple Inc., being the successor to iOS 6. It was announced at the company's Worldwide Developers Conference on June 10, 2013, and was released on September 18 of that year. The design of iOS 7's user interface marked a departure from skeuomorphic elements to flat design and emphasized a minimalist appearance. Functionally, iOS 7 introduced Control Center, AirDrop for file sharing across iOS devices, and multitasking for all apps. - CaptJak
@CaptJak,你的链接没有提供任何有用的信息(不再有效?)。我很想了解更多关于为什么这是一个坏主意的原因。 - Jarrod
@Jarrod,anymore是正确的。我在8月份发布了评论,当时iOS 7还没有发布。链接中的第二段说明iOS 7受NDA保护。由于它不再受NDA保护,而且只有一段话。下面的答案证实了在受NDA保护期间回答这个问题是不明智的事情。 - CaptJak
@CaptJak 是的,保密协议。我理解你的评论是认为删除这行代码不是个好主意。谢谢。 - Jarrod
1
感谢您提供的有关如何删除导航栏下划线的提示! - Dannie P
Helpful: https://dev59.com/gGIk5IYBdhLWcg3wfOOe - Niraj
6个回答

56

导航栏底部的“水平”线只是其shadowImage。 通过应用一个空的UIImage,它可以被简单地移除。 根据文档,您还必须设置一个自定义背景图像:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Set the background and shadow image to get rid of the line.
    [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
    self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];
}

这绝对是最好的答案,不需要任何hacky视图遍历。谢谢。 - Luke
如何收藏一个答案? - Allen
3
这种方法存在的问题是导航栏没有半透明效果。 - The dude
@Thedude,你能够去除阴影并保持半透明吗? - Roi Mulia

21

正如CaptJak所指出的,我其实不应该这样做,但是为了其他遇到困难的人:

for (UIView *view in self.navigationController.navigationBar.subviews) {
    for (UIView *view2 in view.subviews) {
        if ([view2 isKindOfClass:[UIImageView class]]) {
            [view2 removeFromSuperview];
        }
    }
}

在这里输入图像描述


我终于明白了。我在我的VC中添加了一个新的导航栏,它位于导航控制器的导航栏下方。因此,iOS 7的半透明效果在我的导航栏开始的地方给了我一个阴影。 - TOVVV
4
这个方法有点野蛮:它会删除所有带有UIImages的UIBarButtonItems :-/ 我建议检查高度 if([view2 isKindOfClass:[UIImageView class]] && view2.frame.size.height < 2) - auco
你有相同的方法来处理选项卡栏吗? - Michaël
我想这应该是相同的原理。尝试使用以下代码: for (UIView *view in self.tabBar.subview){NSLog(@"%@",view);for(UIView *view2 in view.subview){NSLog(@%@",view2);}} 虽然是凭记忆写的,但应该可以工作。检查所有视图的高度,看看哪一个是您想要删除的,这应该很明显。 - Rambatino
为什么人们要对这个答案进行负评? - Rambatino
显示剩余4条评论

9
在Swift(在iOS9上测试)中,
self.navigationController!.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationController!.navigationBar.shadowImage = UIImage()

1
那个方法很好用,但是现在我无法设置导航栏的色调颜色,它一直是白色的。有什么建议吗?好的,我明白了,只需要在之前添加self.navigationController!.navigationBar.translucent = false就可以了。 - Shyri

0

我曾经遇到过类似的问题,我想在iOS7上移除导航栏中的1像素线和阴影。在我的情况下,我需要在导航栏底部有一条3点粗的绿色线。

如果有一种方法可以摆脱导航栏底部的1像素线而不涉及遍历子视图,我不知道,但是有一种方法可以添加一个视图来隐藏该线(至少可以通过这种方式更改线的颜色)。

UIView * bgView = [[UIView alloc] initWithFrame:CGRectMake(0, navBarHeight, navBarWidth, 1)]; // Dont use magic numbers in your code
bgView.backgroundColor = //some other color
[navigationBar addSubview:bgView];
[navigationBar setShadowImage:nil];

0
如果您的应用程序只支持iOS 6.0+,那么您可以简单地添加以下代码行:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
...
[[UINavigationBar appearance] setShadowImage:[UIImage new]];
...
}

这不行,因为还需要设置 UINavigationBar 的背景,使其不透明。 - wprater
小心使用此建议。这将应用于整个应用程序,而不仅仅是当前控制器。 - Etienne

0

您可以轻松使用名为UINavigationBar-AdditionUINavigationBar类别,该类别可在此处找到。

我已经使用了答案中描述的解决方案,但是我无法摆脱navigationBar下面的1像素线。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接