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

Iphone 如何在iOS 6中禁用带有自定义背景图像的导航栏的导航栏阴影?,iphone,uinavigationbar,shadow,ios6,Iphone,Uinavigationbar,Shadow,Ios6,在iOS 6中,即使设置了自定义背景图像,也会自动将阴影添加到导航栏中。我很确定iOS 5不是这样,因为当我在iOS 5和iOS 6 sim卡中测试相同的代码时,阴影出现在iOS 6中,而不是5中 有人知道这件事吗?或者如何启用/禁用它?一般、不违反保密协议的回答: 如果你不想让某个东西从某个层中伸出来,请将该层遮罩到其边界 [self.layer setMasksToBounds:YES]; 如果单独不起作用,请将高度显式设置为44(或iPhone上的横向设置为32)。您也可以尝试以下方法:

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


有人知道这件事吗?或者如何启用/禁用它?

一般、不违反保密协议的回答:

如果你不想让某个东西从某个层中伸出来,请将该层遮罩到其边界

[self.layer setMasksToBounds:YES];
如果单独不起作用,请将高度显式设置为44(或iPhone上的横向设置为32)。

您也可以尝试以下方法:

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

控制器是一个UINavigationController。

我遇到了同样的问题,我通过以下方法解决了它:

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 

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

self.navigationController.navigationBar.clipsToBounds = YES;

我无法发表评论,因此我将在此处添加我的信息

也许上述建议在测试版中奏效了,但现在看来并非如此

self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];
上面的答案不起作用,上面的其他类似答案也不起作用。我都试过了


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

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

根据属性或方法的存在来做某事的更好方法是:

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

将其放置在AppDelegate中

[[UINavigationBar appearance] setShadowImage:[UIImage new]];
// is IOS 7 and later
[[UINavigationBar appearance] setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
这就是为我做的。希望有帮助

Swift版本及评论更新
有两种可能的解决办法,其他答复中提到了第二种

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

    //如果最小操作系统为iOS 6或更高版本,则省略条件
    if([UINavigationBar实例响应选择器:@selector(setShadowImage:)])){
    [[UINavigationBar外观]设置阴影图像:[[UIImage alloc]init]];
    }
    

  • 来源:,@27:15

    苹果开发文档中关于
    shadowImage
    属性主题的注释:

    讨论:默认值为nil,与默认值相对应 阴影图像。非nil时,此属性表示自定义阴影 要显示的图像,而不是默认图像。对于要创建的自定义阴影图像 如图所示,自定义背景图像也必须设置为 setBackgroundImage:forBarMetrics:method。如果默认背景 如果使用“图像”,则不管如何都将使用默认的阴影图像 该属性的值

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

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

    因为self.navigationController.navigationBar.shadowImage=[[UIImage alloc]init]不工作,我找到了一种简单可行的方法来消除iOS 6和iOS 5中
    UINavigationBar
    的阴影。希望有需要的人能看到这个帖子

    您只需准备一张背景图像,其高度比导航栏高度大1个像素(例如,默认UINavigationBar为320×45,当然是2x为640×90)

    然后只需使用
    [[UINavigationBar外观]setBackgroundImage:…]
    ,您将发现阴影被1个像素所取代。干杯


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

    我在试图让导航条在iOS6和iOS7之间看起来一样时遇到了这个问题

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

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

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

    另一种方法如何:

    UINavigationBar.appearance().barStyle=.Black


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

    在Swift 3.0中,看起来是这样的

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

    iOS 6是测试版的预发布软件,我很确定它现在在NDA下。我会删除这个问题以避免得到所有NDA评论,并将其发布在苹果为预发布软件提供的开发论坛上。查看UI自定义会话视频againDavid是正确的-UI自定义视频涵盖了这一主题。这解决了问题,但会导致任何“突出显示触摸”(白光)的UIBarButtonims在点击时呈现错误。有一个更好的答案涉及图像文件,但这说明的太多了。那是什么属性,层?除了在旋转过程中,当阴影返回时,这是有效的。上面Dima Korbin的答案似乎是最完整的解决方案。在iOS 7上,这也隐藏了状态栏:(很好,我在iOS 6应用程序上的其他答案也适用于iOS 7:)记住,这只适用于iOS 6。从UINavigationBar.h:/*默认值为零。非nil时,显示自定义阴影图像,而不是默认阴影图像…*/@属性(非原子,保留)UIImage*阴影图像NS\u可用\u IOS(6\u 0)UI\u外观\u选择器;注意:要显示自定义阴影图像,还必须使用setBackgroundImage:forBarMetrics:方法设置自定义背景图像。如果使用默认背景图像,则无论此属性的值如何,都将使用默认阴影图像。这是正确答案<代码>self.navigationBar.shadowImage=nil的效果与答案中描述的技术不同。您可能希望向[[UIImage alloc]init]@BasHoltrop自动释放添加自动释放?中世纪已经过去了>=iOS7的完整解决方案是--
    [[UINavigationBar
    
    UINavigationBar.appearance().shadowImage = UIImage ()
    UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)