【问题标题】:How to remove UINavigationBar inner shadow in iOS 7?如何在 iOS 7 中删除 UINavigationBar 内阴影?
【发布时间】:2013-08-12 04:21:30
【问题描述】:

Inner shadow example

我正在尝试将导航栏放在另一个导航栏下方,以使其看起来像一个高导航栏。但在 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)

【问题讨论】:

  • @CaptJak 你的链接没有提供任何有用的信息(还有吗?)。我有兴趣进一步了解为什么这是一个坏主意。
  • @Jarrod,再正确不过了。我在 iOS 7 发布之前的 8 月发布了评论。链接中的第二段指出 iOS 7 处于 NDA 之下。因为它不再属于 NDA 并且也只有一个段落。下面的答案与以下事实一致,即在 NDA 下回答这个问题并不是一个好主意。
  • @CaptJak 啊是的 NDA。我认为您的评论意味着删除该行是一个坏主意。谢谢。
  • 感谢您提供有关如何删除导航栏下线条的提示!

标签: uinavigationbar shadow ios7


【解决方案1】:

我真的不应该像 CaptJak 指出的那样,但对于其他陷入困境的人:

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

【讨论】:

  • 不,在 iOS7 中,该代码仅删除了底部的水平线。影子还在。
  • 我的身上没有影子。我认为您指的是彩色 tableviewcells/tableviewheaders 产生的阴影
  • 这不是 tableview 阴影。 tableview 比导航栏低得多。您的代码产生的结果与我在屏幕截图上的结果相同。您的代码仅适用于 codeself.navigationController.navigationBar.translucent = NO;code 但这不是我想要的
  • 我终于明白了。我在我的 VC 中添加了新的导航栏,它位于导航控制器的导航栏下。所以,iOS 7 的半透明给了我导航栏开始的阴影
  • 虽然有点蛮力:这个方法也会删除所有带有 UIImages 的 UIBarButtonItems :-/ 我建议检查高度 if([view2 isKindOfClass:[UIImageView class]] && view2.frame.size.height < 2)
【解决方案2】:

导航栏底部的“水平”线就是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];
}

【讨论】:

  • 这是迄今为止最好的答案,不涉及任何骇人听闻的视图遍历。谢谢。
  • 我如何收藏答案?
  • 这种做法的问题是导航栏没有半透明效果。
  • @Thedude 你能去除阴影并保持半透明吗?
【解决方案3】:

如果您的应用仅支持 iOS 6.0+,您只需添加以下行:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
...
[[UINavigationBar appearance] setShadowImage:[UIImage new]];
...
}

【讨论】:

  • 这行不通,因为还需要设置 UINavigationBar 的背景,使其不透明。
  • 小心这个建议。这将适用于整个应用程序,而不仅仅是手头的控制器。
【解决方案4】:

我有一个类似的问题,我想从 iOS7 的导航栏中删除 1px 线和阴影。 在我的例子中,我需要在导航栏底部有一条 3 磅粗的绿线。

如果有一个解决方案可以摆脱导航栏底部不涉及遍历子视图的 1px 行,我不知道,但是有一种方法可以添加一个隐藏该行的视图跟随(至少线的颜色可以这样改变)。

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];

【讨论】:

    【解决方案5】:

    Swift 中(在 iOS9 上测试)

    self.navigationController!.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
    self.navigationController!.navigationBar.shadowImage = UIImage()
    

    【讨论】:

    • 效果很好,但现在我无法设置导航栏的色调,它保持白色。有什么建议吗?好的,我明白了,只需在之前添加 self.navigationController!.navigationBar.translucent = false
    【解决方案6】:

    您可以轻松地使用这个名为UINavigationBar-AdditionUInavigationBar 类别找到here 我已经使用了answer 中描述的解决方案,但我无法摆脱导航栏下的 1Px 行

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      相关资源
      最近更新 更多