37

有没有办法删除iOS7在导航栏下自动显示的底部边框?

4

9 回答 9

48

这不适用于导航半透明或不透明的iOS7...

来自 Apple 文档的粘贴;

描述 用于导航栏的阴影图像。默认值为 nil,对应于默认的阴影图像。当非零时,此属性表示要显示的自定义阴影图像而不是默认值。要显示自定义阴影图像,还必须使用 setBackgroundImage:forBarMetrics: 方法设置自定义背景图像。如果使用默认背景图像,则无论此属性的值如何,都将使用默认阴影图像。

所以基本上你需要实现那个setBackgroundImage。 附加说明,在 iOS7 上,您将不再使用外观,但您将在您现在所在的 viewController 上下文中修改导航栏。

那是:

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

在我的例子中,我把它放在 viewDidLoad 中(可以为 UINavigationViewController 中的每个 UIViewController 添加自定义行为)。

于 2013-12-19T16:00:48.463 回答
46

如果我理解正确,请尝试

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
于 2013-09-27T10:02:20.833 回答
12

基于 muffed2k answer+ 编程 Thomas 评论,这就是我用来显示没有背景图像(ios5.1/6.0)和没有底部边框(ios7.0)的 UINavigationBar 的内容:

  if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6)
    {
        [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
        [[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
    }else
    {
        [[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
    }
于 2013-10-16T19:22:21.717 回答
6

如果您使用 Swift 并遇到此问题,请在主 ViewController 中尝试此操作:

override func viewDidLoad() {
    super.viewDidLoad()

    /// ...

    navigationController?.navigationBar.shadowImage = UIImage();
    navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)

    //...
}

基于以上@wolffan 的回答

于 2015-05-19T17:07:34.827 回答
4

对我来说,以下工作在 iOS 7 到 9+ 上工作时translucent设置为false

UINavigationBar.appearance().transluscent = false
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics:.Default)
于 2015-09-30T12:02:40.710 回答
2

我知道已经有一个公认的答案,但另一种方法是将 clipToBounds 设置为 true。

这是快速执行此操作的一行代码

self.navigationController?.navigationBar.clipsToBounds = true

像魅力一样为我工作。

于 2015-08-12T21:48:54.447 回答
1

对于目标 c

self.navigationController.navigationBar.clipsToBounds = YES;
于 2016-09-16T06:12:02.897 回答
1

像魅力一样工作:Swift 3.x 版本

    navigationController?.navigationBar.shadowImage = UIImage()
    navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
于 2016-10-04T13:03:32.657 回答
0

如果您的目标是 iOS 7 并且没有设置背景图像,那么这将起作用:

        CGFloat navigationBarWidth = self.navigationController.navigationBar.frame.size.width;
        CGFloat navigationBarHeight = self.navigationController.navigationBar.frame.size.height;
        CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;

        UIGraphicsBeginImageContextWithOptions(CGSizeMake(navigationBarWidth, navigationBarHeight + statusBarHeight), NO, 0.0);
        UIImage *blank = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        [[UINavigationBar appearance] setBackgroundImage:blank forBarMetrics:UIBarMetricsDefault];

        //the following line takes away the border but only works if a background image is set (above)
        [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];

我从@muffe2k 的回答和这篇 SO 帖子中得到了这个想法。

于 2014-04-29T04:45:15.300 回答