如何在 iOS 7 中制作完全透明的导航栏

Posted

技术标签:

【中文标题】如何在 iOS 7 中制作完全透明的导航栏【英文标题】:How to make completely transparent navigation bar in iOS 7 【发布时间】:2013-10-05 15:38:39 【问题描述】:

我希望我的应用程序中的 UINavigationBar 完全透明,并与它正下方的视图控制器齐平。但是,我能找到的唯一代码使它半透明但不透明。我知道这可以在 ios 7 中完成,因为它在笔记应用程序中使用。我的问题是,他们用来做这件事的代码是什么?

【问题讨论】:

【参考方案1】:

来自this answer

[self.navigationController.navigationBar setBackgroundImage:[UIImage new]
                     forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [UIImage new];
self.navigationController.navigationBar.translucent = YES;
self.navigationController.view.backgroundColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];

此外,正如 Josh 在 cmets 中所建议的,将栏恢复为默认值:

[self.navigationController.navigationBar setBackgroundImage:nil
                     forBarMetrics:UIBarMetricsDefault];

【讨论】:

还要确保你没有self.edgesForExtendedLayout = UIRectEdgeNone; 有办法扭转这种情况吗? @Zorayr [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];会将栏恢复为默认值。 有没有办法使用这种方法来切换导航栏的透明度? 我在 scrollViewDidScroll 上实现了这个并且有一个跳转。如何解决?【参考方案2】:

艾伦忘记了一行

self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];

所以我有:

[self.navigationController.navigationBar setTranslucent:YES];
self.navigationController.view.backgroundColor = [UIColor clearColor];
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];

【讨论】:

【参考方案3】:

作为 Objective-C 类别的自包含解决方案:

UINavigationController+TransparentNavigationController.h

@interface UINavigationController (TransparentNavigationController)
- (void)presentTransparentNavigationBar;
- (void)hideTransparentNavigationBar;
@end

UINavigationController+TransparentNavigationController.m

#import "UINavigationController+TransparentNavigationController.h"

@implementation UINavigationController (TransparentNavigationController)

- (void)presentTransparentNavigationBar

  [self.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
  [self.navigationBar setTranslucent:YES];
  [self.navigationBar setShadowImage:[UIImage new]];
  [self setNavigationBarHidden:NO animated:YES];


- (void)hideTransparentNavigationBar

  [self setNavigationBarHidden:YES animated:NO];
  [self.navigationBar setBackgroundImage:[[UINavigationBar appearance] backgroundImageForBarMetrics:UIBarMetricsDefault] forBarMetrics:UIBarMetricsDefault];
  [self.navigationBar setTranslucent:[[UINavigationBar appearance] isTranslucent]];
  [self.navigationBar setShadowImage:[[UINavigationBar appearance] shadowImage]];


@end

现在,您可以在 UIViewController 中导入类别并调用导航控制器上的方法 - 例如:

#import "UINavigationController+TransparentNavigationController.h"

- (void)viewWillAppear:(BOOL)animated

  [super viewWillAppear:animated];
  [self.navigationController presentTransparentNavigationBar];


- (void)viewWillDisappear:(BOOL)animated

  [super viewWillDisappear:animated];
  [self.navigationController hideTransparentNavigationBar];

Swift 中也有类似的解决方案:

import Foundation
import UIKit

extension UINavigationController 

  public func presentTransparentNavigationBar() 
    navigationBar.setBackgroundImage(UIImage(), forBarMetrics:UIBarMetrics.Default)
    navigationBar.translucent = true
    navigationBar.shadowImage = UIImage()
    setNavigationBarHidden(false, animated:true)
  

  public func hideTransparentNavigationBar() 
    setNavigationBarHidden(true, animated:false)
    navigationBar.setBackgroundImage(UINavigationBar.appearance().backgroundImageForBarMetrics(UIBarMetrics.Default), forBarMetrics:UIBarMetrics.Default)
    navigationBar.translucent = UINavigationBar.appearance().translucent
    navigationBar.shadowImage = UINavigationBar.appearance().shadowImage
  

【讨论】:

我怎样才能再次显示它(例如,如果我不想让它只在 NavigationController 的 1 个视图中透明?) - 我可以将它重置为我的默认值吗? hideTransparentNavigationBar() 应该重置它。 在 viewWillAppear/disappear 中调用 present/hide 方法会导致两个不同导航栏之间的过渡动​​画效果不佳!在 pushViewController 中通过滑动手势(从左到右)可以很好地看到它 尝试在父视图控制器的viewDidHide 中调用它。 使用 LargeTitle 隐藏透明导航栏时,iOS 11 显示黑色背景【参考方案4】:

适用于 Swift3 和 Swift4

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true

对于 Swift2.2

 self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
 self.navigationController?.navigationBar.shadowImage = UIImage()
 self.navigationController?.navigationBar.translucent = true

对于 Objective-C

[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [UIImage new];
self.navigationController.navigationBar.translucent = YES;

【讨论】:

感谢这是将导航栏设置为完全透明的简单方法【参考方案5】:

使用UINavigationBar+Addition pod,然后直接调用:

UINavigationBar *navigationBar = self.navigationController.navigationBar;
[navigationBar makeTransparent];

【讨论】:

【参考方案6】:

[(UIView*)[self.navigationController.navigationBar.subviews objectAtIndex:0] setAlpha:0.0f];

那一行似乎对我来说很完美

【讨论】:

【参考方案7】:

@Zorayr 的最佳答案已修改为 Swift 3:

import Foundation
import UIKit

extension UINavigationController 

    public func presentTransparentNavigationBar() 
        navigationBar.setBackgroundImage(UIImage(), for:.default)
        navigationBar.isTranslucent = true
        navigationBar.shadowImage = UIImage()
        setNavigationBarHidden(false, animated:true)
    

    public func hideTransparentNavigationBar() 
        setNavigationBarHidden(true, animated:false)
        navigationBar.setBackgroundImage(UINavigationBar.appearance().backgroundImage(for: UIBarMetrics.default), for:.default)
        navigationBar.isTranslucent = UINavigationBar.appearance().isTranslucent
        navigationBar.shadowImage = UINavigationBar.appearance().shadowImage
    

【讨论】:

【参考方案8】:

Swift 4.2 和 iOS 12

事实证明,您真正需要的只是下面的代码。当您将其放入 viewDidLoad() 时,它可以完美运行。

// removes line at bottom of navigation bar
navigationController?.navigationBar.shadowImage = UIImage()

// makes navigation bar completely transparent
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.isTranslucent = true

【讨论】:

以上是关于如何在 iOS 7 中制作完全透明的导航栏的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 7 中使导航栏透明? [复制]

如何让 Flutter 应用在​​ android 导航栏后面绘制并使导航栏完全透明?

你如何制作一个彩色和半透明的导航栏(iOS)?

在我的导航栏 iOS 7 中设置色调/半透明级别的问题

iOS 7 清除导航栏

iOS 7 半透明标签栏和导航栏