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

cor*_*erg 126 transparency cocoa-touch uinavigationbar translucency

我希望我的应用程序中的UINavigationBar完全透明,并在其下直接与viewcontroller刷新.但是,我能找到的唯一代码使它半透明但不透明.我知道这可以在iOS 7中完成,因为它在笔记应用程序中使用.我的问题是,他们用来做什么代码?

Ala*_*lan 292

这个答案

[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];
Run Code Online (Sandbox Code Playgroud)

另外,正如Josh在评论中所建议的那样,将条形图恢复为默认值:

[self.navigationController.navigationBar setBackgroundImage:nil
                     forBarMetrics:UIBarMetricsDefault];
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法扭转这种局面? (25认同)
  • @Zorayr [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; 将该栏恢复为默认值. (12认同)
  • 有没有办法使用此方法切换导航栏的透明度动画? (7认同)
  • 还要确保你没有`self.edgesForExtendedLayout = UIRectEdgeNone;` (6认同)
  • 我在scrollViewDidScroll上实现了这个并且有一个跳转.怎么修? (3认同)
  • 这会导致navigationBar在导航回来时显示黑色图像一秒钟.有办法解决这个问题吗? (2认同)

vic*_*hai 76

对于Swift3和Swift4

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
Run Code Online (Sandbox Code Playgroud)

对于Swift2.2

 self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
 self.navigationController?.navigationBar.shadowImage = UIImage()
 self.navigationController?.navigationBar.translucent = true
Run Code Online (Sandbox Code Playgroud)

对于Objective-C

[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [UIImage new];
self.navigationController.navigationBar.translucent = YES;
Run Code Online (Sandbox Code Playgroud)


Zor*_*ayr 39

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

UINavigationController的+ TransparentNavigationController.h

@interface UINavigationController (TransparentNavigationController)
- (void)presentTransparentNavigationBar;
- (void)hideTransparentNavigationBar;
@end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

现在,您可以导入类别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];
}
Run Code Online (Sandbox Code Playgroud)

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
  }
}
Run Code Online (Sandbox Code Playgroud)


Dam*_*ito 15

艾伦忘了一条线

self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
Run Code Online (Sandbox Code Playgroud)

所以我有:

[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];
Run Code Online (Sandbox Code Playgroud)

  • 感谢Damien,已编辑并包含在答案中. (2认同)

Dip*_*aze 5

@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
    }
}
Run Code Online (Sandbox Code Playgroud)