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

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

【问题讨论】:

    标签: cocoa-touch uinavigationbar transparency translucency


    【解决方案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
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-02-26
              • 1970-01-01
              相关资源
              最近更新 更多