透明导航栏iOS


121

我正在创建一个应用程序,并且已经在Internet上浏览了,我想知道他们如何制作这种透明的NavigationBar,如下所示:

在此处输入图片说明

我在appdelegate中添加了以下内容:

UINavigationBar.appearance().translucent = true

但这只会使它看起来像以下内容:

在此处输入图片说明

我如何使NavigationBar像第一个图像一样透明


使用我不知道的代码,但是如果您对CSS很好,则可以使用框架(Pixate:freestyle.org),并且可以将CSS样式应用于navbar :)!
Nicolas Charvoz 2014年

Answers:


286

您可以将如下所示的导航栏图像应用于半透明。

目标C:

[self.navigationController.navigationBar setBackgroundImage:[UIImage new]
                     forBarMetrics:UIBarMetricsDefault]; //UIImageNamed:@"transparent.png"
self.navigationController.navigationBar.shadowImage = [UIImage new];////UIImageNamed:@"transparent.png"
self.navigationController.navigationBar.translucent = YES;
self.navigationController.view.backgroundColor = [UIColor clearColor];

斯威夫特3:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) //UIImage.init(named: "transparent.png")
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.view.backgroundColor = .clear

希望对您有帮助。


4
当我setBackgroundImage它删除barTintColor吗?
彼得·皮克

您可以获取导航栏的图像。.根据您的需要..并如上所述应用于导航栏。(您要应用于导航栏的图像)
Vidhyanand

1
无需设置navigationController的backgroundColor
matt bezark

4
通过此解决方案,我得到一个黑色的NavigationBar,有什么想法吗?
卡洛斯·德尔·布兰科

1
不符合预期。当您执行此操作时,您将不会像Alpha值为0.7那样使墙壁透明,而PLUS也会覆盖状态栏。如果在iOS 13上执行此操作,则将只有一个外观漂亮的矩形,其上方是STATUS BAR CRYSTAL CLEAR。该问题的作者对其明确而具体。
Marlhex

122

快速解决方案

这是我发现的最好方法。您可以将其粘贴到appDelegate的 didFinishLaunchingWithOptions方法中:

迅捷3/4

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    // Sets background to a blank/empty image
    UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
    // Sets shadow (line below the bar) to a blank image
    UINavigationBar.appearance().shadowImage = UIImage()
    // Sets the translucent background color
    UINavigationBar.appearance().backgroundColor = .clear
    // Set translucent. (Default value is already true, so this can be removed if desired.)
    UINavigationBar.appearance().isTranslucent = true
    return true
}

雨燕2.0

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    // Sets background to a blank/empty image
    UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)
    // Sets shadow (line below the bar) to a blank image
    UINavigationBar.appearance().shadowImage = UIImage()
    // Sets the translucent background color
    UINavigationBar.appearance().backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0)
    // Set translucent. (Default value is already true, so this can be removed if desired.)
    UINavigationBar.appearance().translucent = true

    return true
}

来源:关于iOS 8.1中的下图,使导航栏透明


3
您的Swift 3解决方案只会使我的工具栏变成纯白色。
何塞·拉米雷斯

@JozemiteApps尝试创建一个全新的Xcode项目并将其粘贴到其中。只需3分钟即可确认上面的代码是我的代码还是导致此问题的有关您的项目的信息。
Dan Beaulieu

1
我也有一个纯白色的导航栏和一个不透明的导航栏
Kingalione

效果很好,谢谢!您知道如何实现它,以使所需ViewController上的导航栏唯一透明吗?
RufusV

@JoseRamirez可能是您看到的viewController的背景。您需要更改第一个视图的顶部约束以与超级视图对齐,而不是与安全区域或边距对齐。
turingtest

27

Swift 5仅适用于当前视图控制器

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Make the navigation bar background clear
    navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationController?.navigationBar.shadowImage = UIImage()
    navigationController?.navigationBar.isTranslucent = true
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    // Restore the navigation bar to default
    navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
    navigationController?.navigationBar.shadowImage = nil
}


12

Swift 4.2解决方案:对于透明背景:

  1. 对于一般方法:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
        self.navigationController?.navigationBar.shadowImage = UIImage()
        self.navigationController?.navigationBar.isTranslucent = true
    
    }
  2. 对于特定对象:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        navBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
        navBar.shadowImage = UIImage()
        navBar.navigationBar.isTranslucent = true
    
    }

希望它有用。


你指的是什么对象navBar
Sergey Gamayunov,

@SergeyGamayunov navBar在这里,指的是UINavigationBar的对象。
Ümañgßürmån

那就是他的意思...让navBar = self.navigationController?.navigationBar
Marlhex

8

我能够通过以下方式快速完成此任务:

let navBarAppearance = UINavigationBar.appearance()
let colorImage = UIImage.imageFromColor(UIColor.morselPink(), frame: CGRectMake(0, 0, 340, 64))
navBarAppearance.setBackgroundImage(colorImage, forBarMetrics: .Default)

我在UIColor类别中创建了以下实用程序方法:

imageFromColor(color: UIColor, frame: CGRect) -> UIImage {
  UIGraphicsBeginImageContextWithOptions(frame.size, false, 0)
  color.setFill()
  UIRectFill(frame)
  let image = UIGraphicsGetImageFromCurrentImageContext()
  UIGraphicsEndImageContext()
  return image
}

这应该是最佳答案!
Mihail Salari

7

它对我有用:

    let bar:UINavigationBar! =  self.navigationController?.navigationBar
    self.title = "Whatever..."
    bar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
    bar.shadowImage = UIImage()
    bar.alpha = 0.0 

5

设置您的navigationBar的background属性,例如

navigationController?.navigationBar.backgroundColor = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 0.5)

(如果没有导航控制器,则可能需要稍作更改,但这应该使您知道该怎么做。)

另外,请确保下面的视图实际上在条形下方延伸。


这给了我以下信息:i.stack.imgur.com/GT3WV.png我怎样才能像我发布的第一个链接(图片)一样使颜色更红色
Peter Pik 2014年

您可以使用alpha值并将其从0.5更改为0.0到1.0之间的任何值。就像我说的,请确保下面的视图位于导航栏下方,否则您将看不到任何内容通过导航栏发光。如果您使用的是Interface Builder,则可以拖动该视图的上边缘并将其与屏幕的上边缘对齐。
Atomix 2014年

2

试试这个,如果您还需要支持ios7,它对我有用,它基于UItoolBar的透明度:

[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];
    UIToolbar* blurredView = [[UIToolbar alloc] initWithFrame:self.navigationController.navigationBar.bounds];
    [blurredView setBarStyle:UIBarStyleBlack];
    [blurredView setBarTintColor:[UIColor redColor]];
    [self.navigationController.navigationBar insertSubview:blurredView atIndex:0];

2

对于那些寻求OBJC解决方案的人,可以在App Delegate didFinishLaunchingWithOptions方法中添加:

[[UINavigationBar appearance] setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
[UINavigationBar appearance].shadowImage = [UIImage new];
[UINavigationBar appearance].backgroundColor = [UIColor clearColor];
[UINavigationBar appearance].translucent = YES;

1

如果您希望能够在保持相同视图的情况下以编程方式迅速执行此操作4,

if change {
        navigationController?.navigationBar.isTranslucent = false
        self.navigationController?.navigationBar.backgroundColor = UIColor(displayP3Red: 255/255, green: 206/255, blue: 24/255, alpha: 1)
        navigationController?.navigationBar.barTintColor = UIColor(displayP3Red: 255/255, green: 206/255, blue: 24/255, alpha: 1)
    } else {
        navigationController?.navigationBar.isTranslucent = true
        navigationController?.navigationBar.setBackgroundImage(backgroundImage, for: .default)
        navigationController?.navigationBar.backgroundColor = .clear
        navigationController?.navigationBar.barTintColor = .clear
    }

要记住的一件事是单击情节提要中的此按钮。我有一个很长时间的跳跃显示问题。确保您设置以下内容:在此处输入图片说明

然后,当您更改导航栏的透明度时,无论导航栏的可见性如何,由于视图一直延伸到顶部,因此不会导致视图跳转。


1

将此添加到您的加载中

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.0)
//adjust alpha according to your need 0 is transparent 1 is solid

0

通过传递navigationController和要在导航栏上设置的颜色来调用的实用程序方法。为了透明,你可以使用clearColorUIColor类。

对于目标c-

+ (void)setNavigationBarColor:(UINavigationController *)navigationController 
                               color:(UIColor*) color {
   [navigationController setNavigationBarHidden:false animated:false];
   [navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
   [navigationController.navigationBar setShadowImage:[UIImage new]];
   [navigationController.navigationBar setTranslucent:true];
   [navigationController.view setBackgroundColor:color];
   [navigationController.navigationBar setBackgroundColor:color];
}

对于Swift 3.0-

class func setNavigationBarColor(navigationController : UINavigationController?, 
                                 color : UIColor) {
    navigationController?.setNavigationBarHidden(false, animated: false)
    navigationController?.navigationBar .setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
    navigationController?.navigationBar.shadowImage = UIImage()
    navigationController?.navigationBar.translucent = true
    navigationController?.view.backgroundColor = color
    navigationController?.navigationBar.backgroundColor =  color
}

0

我一直在努力,使用不同用户在此处提供的响应时遇到了问题。问题是iOS 13+上我的NavigationBar透明图像后面的白框

在此处输入图片说明

我的解决方案是这个

if #available(iOS 13, *) {
    navBar?.standardAppearance.backgroundColor = UIColor.clear
    navBar?.standardAppearance.backgroundEffect = nil
    navBar?.standardAppearance.shadowImage = UIImage()
    navBar?.standardAppearance.shadowColor = .clear
    navBar?.standardAppearance.backgroundImage = UIImage()
}

希望这对遇到同样问题的人有所帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.