[英]Make UINavigationBar transparent
你如何使UINavigationBar 透明? 雖然我希望它的酒吧項目保持可見。
如果有人想知道如何在 iOS 7+ 中實現這一點,這里有一個解決方案(iOS 6 也兼容)
在 Objective-C 中
[self.navigationBar setBackgroundImage:[UIImage new]
forBarMetrics:UIBarMetricsDefault];
self.navigationBar.shadowImage = [UIImage new];
self.navigationBar.translucent = YES;
在 swift 3 (iOS 10)
self.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.isTranslucent = true
在迅速 2
self.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.translucent = true
由於UINavigationBar
文檔中討論的行為,在導航欄上將translucent
設置為YES
可以解決問題。 我將在這里報告相關片段:
如果在具有不透明自定義背景圖像的導航欄上將此屬性設置為
YES
,則導航欄將對圖像應用小於 1.0 的系統不透明度。
在 iOS5 中,您可以這樣做以使導航欄透明:
nav.navigationBar.translucent = YES; // Setting this slides the view up, underneath the nav bar (otherwise it'll appear black)
const float colorMask[6] = {222, 255, 222, 255, 222, 255};
UIImage *img = [[UIImage alloc] init];
UIImage *maskedImage = [UIImage imageWithCGImage: CGImageCreateWithMaskingColors(img.CGImage, colorMask)];
[nav.navigationBar setBackgroundImage:maskedImage forBarMetrics:UIBarMetricsDefault];
[img release];
從IOS7:
self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.shadowImage = [UIImage new];
self.navigationController.view.backgroundColor = [UIColor clearColor];
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
如果您使用最新的測試版 iOS 13.4 和 Xcode 11.4 構建,則接受的答案將不再有效。 我找到了另一種方法,可能只是測試版軟件中的一個錯誤,但我把它寫在那里,以防萬一
(迅速 5)
import UIKit
class TransparentNavBar :UINavigationBar {
override func awakeFromNib() {
super.awakeFromNib()
self.setBackgroundImage(UIImage(), for: .default)
self.shadowImage = UIImage()
self.isTranslucent = true
self.backgroundColor = .clear
if #available(iOS 13.0, *) {
self.standardAppearance.backgroundColor = .clear
self.standardAppearance.backgroundEffect = .none
self.standardAppearance.shadowColor = .clear
}
}
}
對於任何想在 Swift 2.x 中執行此操作的人:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.translucent = true
或 Swift 3.x:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
這似乎有效:
@implementation UINavigationBar (custom)
- (void)drawRect:(CGRect)rect {}
@end
navigationController.navigationBar.backgroundColor = [UIColor clearColor];
在做了上面其他人所說的之后,即:
navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.isTranslucent = true
...我的導航欄仍然是白色的。 所以我添加了這一行:
navigationController?.navigationBar.backgroundColor = .clear
……瞧! 這似乎奏效了。
下面的代碼擴展了為此線程選擇的最佳答案,以擺脫底部邊框並設置文本顏色:
此代碼的最后兩行代碼設置透明度。 我從該線程中借用了該代碼,並且效果很好!
“clipsToBounds”屬性是我發現的代碼,它在沒有設置透明度的情況下去掉了底部邊框線(因此,如果您決定使用純白色/黑色/等背景代替,仍然沒有邊框線)。
“tintColor”行(第二行編碼)將我的后退按鈕設置為淺灰色
我保留了 barTintColor 作為備份。 我不知道為什么透明度不起作用,但如果不起作用,我想要我的 bg white 就像我曾經擁有的那樣
let navigationBarAppearace = UINavigationBar.appearance() navigationBarAppearace.tintColor = UIColor.lightGray navigationBarAppearace.barTintColor = UIColor.white navigationBarAppearace.clipsToBounds = true navigationBarAppearace.isTranslucent = true navigationBarAppearace.setBackgroundImage(UIImage(), for: .default) navigationBarAppearace.shadowImage = UIImage()
我知道這個話題很老,但是如果人們想知道它是如何在不重載 drawRect 方法的情況下完成的。
這就是你需要的:
self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.opaque = YES;
self.navigationController.navigationBar.tintColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
override func viewDidLoad()
{
super.viewDidLoad()
let appearance = UINavigationBarAppearance()
appearance.configureWithTransparentBackground()
//appearance.backgroundColor = UIColor.clear
navigationItem.compactAppearance = appearance
navigationItem.scrollEdgeAppearance = appearance
navigationItem.standardAppearance = appearance
//...
}
為了清楚起見,這使得UINavigationBar
完全透明。 條形按鈕項仍然可見並且可以正常工作。
override func viewDidLoad()
{
super.viewDidLoad()
navigationController?.navigationBar.isTranslucent = true
navigationController?.navigationBar.isOpaque = false
//...
}
這讓我意識到我實際上並不知道透明和半透明RIP 之間的區別。
https://www.lexico.com/en/definition/transparent
https://www.lexico.com/en/definition/translucent
以我提供的方式設置外觀后更改navigationItem
欄按鈕將重置外觀,您必須再次執行此操作。
NavigationController.NavigationBar.SetBackgroundImage(new UIImage(), UIBarMetrics.Default);
NavigationController.NavigationBar.ShadowImage = new UIImage();
NavigationController.NavigationBar.Translucent = true;
對於 Swift 3.0:
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = true
}
試試下面的一段代碼:
self.navigationController.navigationBar.translucent = YES;
對我有用的另一種方法是子類 UINavigationBar 並將 drawRect 方法留空!
@IBDesignable class MONavigationBar: UINavigationBar {
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
// Drawing code
}}
在斯威夫特 4.2
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
(在 viewWillAppear 中),然后在 viewWillDisappear 中,要撤消它,放
self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.isTranslucent = false
這適用於 Swift 5。
// Clear the background image.
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
// Clear the shadow image.
navigationController?.navigationBar.shadowImage = UIImage()
// Ensure the navigation bar is translucent.
navigationController?.navigationBar.isTranslucent = true
你的意思是完全透明,還是使用照片應用程序中看到的半透明黑色樣式? 后者可以通過將其barStyle
屬性設置為UIBarStyleBlackTranslucent
來完成。 前者……我不確定。 如果您希望其上的項目仍然可見,您可能需要在欄的視圖層次結構中進行一些挖掘並刪除包含其背景的視圖。
這適用於 Swift 2.0。
navigationController!.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
navigationController!.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.translucent = true
檢查RRViewControllerExtension ,它專門用於 UINavigation 欄外觀管理。
在您的項目中使用 RRViewControllerExtension,您只需要覆蓋
-(BOOL)prefersNavigationBarTransparent;
在您的視圖控制器中。
Swift 5<\/strong> :: 在 AppDelegate 的 didFinishLaunchingWithOptions 函數中調用下面的技巧(這將應用於您的所有導航欄,但不要忘記切換您的視圖控制器)
let navBarAppearance = UINavigationBarAppearance()
navBarAppearance.configureWithTransparentBackground()
navigationController?.navigationBar.standardAppearance = navBarAppearance
navigationController?.navigationBar.scrollEdgeAppearance = navBarAppearance
extension UINavigationBar {
var isTransperent: Bool {
get {
return false // Just to satisfy property
}
set {
if newValue {
self.shadowImage = UIImage()
self.isTranslucent = true
self.setBackgroundImage(UIImage(), for: .default)
} else {
self.shadowImage = UIImage()
self.isTranslucent = false
self.setBackgroundImage(nil, for: .default)
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.