如何在 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 中制作完全透明的导航栏的主要内容,如果未能解决你的问题,请参考以下文章