Cocoa touch 如何在iOS 7中创建完全透明的导航栏

Cocoa touch 如何在iOS 7中创建完全透明的导航栏,cocoa-touch,uinavigationbar,transparency,translucency,Cocoa Touch,Uinavigationbar,Transparency,Translucency,我希望我的应用程序中的UINavigationBar完全透明,并与它正下方的viewcontroller齐平。然而,我能找到的唯一代码是半透明的,但不是透明的。我知道这可以在iOS 7中实现,因为它用于notes应用程序。我的问题是,他们用来做这件事的代码是什么 来自 此外,正如Josh在评论中所建议的,要将该条恢复为默认值: [self.navigationController.navigationBar setBackgroundImage:nil

我希望我的应用程序中的UINavigationBar完全透明,并与它正下方的viewcontroller齐平。然而,我能找到的唯一代码是半透明的,但不是透明的。我知道这可以在iOS 7中实现,因为它用于notes应用程序。我的问题是,他们用来做这件事的代码是什么

来自

此外,正如Josh在评论中所建议的,要将该条恢复为默认值:

[self.navigationController.navigationBar setBackgroundImage:nil
                     forBarMetrics:UIBarMetricsDefault];
艾伦忘了一行

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

作为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
  }
}

适用于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
对于目标-C

使用pod,然后简单地调用:

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


这一行对我来说似乎非常合适

@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
    }
}

Swift 4.2和iOS 12

 self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
 self.navigationController?.navigationBar.shadowImage = UIImage()
 self.navigationController?.navigationBar.translucent = true
事实证明,您真正需要的是下面的代码。当您将其放入
viewDidLoad()
中时,它可以完美地工作


还要确保您没有
self.edgesForExtendedLayout=UIRectEdgeNone有办法扭转这种局面吗?@Zorayr[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];将使导航栏恢复默认。是否有任何方法可以使用此方法切换导航栏的透明度动画?我在scrollViewDidScroll上实现了这一点,并且有一个跳转。如何修复?如何再次显示它(例如,如果我想使它仅在NavigationController的一个视图中透明?)-我可以将其重置为默认值吗?
hideTransparentNavigationBar()
应将其重置。在视图中调用present/hide方法将出现/消失,从而导致两个不同导航栏之间的过渡动画不正确!您可以通过在父视图控制器的pushedViewControllerTry中调用它,在PushedViewDidHide中执行滑动手势(从左到右)来很好地看到它。在iOS 11上使用LarGetTitle隐藏透明导航条时显示黑色背景。这是一种将导航条设置为完全透明的简单方法
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
    }
}
// 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