回答:
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
ドキュメントで説明されている動作により、ナビゲーションバーtranslucent
をYES
に設定するとうまくいきUINavigationBar
ます。ここで関連するフラグメントを報告します。
YES
不透明なカスタム背景画像のあるナビゲーションバーでこのプロパティをに設定すると、ナビゲーションバーは1.0未満のシステム不透明度を画像に適用します。
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true
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];
[[UINavigationBar appearance] setShadowImage: [[UIImage alloc] init]];
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];
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];
-drawRect:
では、カテゴリではなくサブクラス本体でオーバーライドし、このサブクラスをナビゲーションバーとして使用する必要があるようです。
上で他の誰もが言ったことをした後、すなわち:
navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.isTranslucent = true
... ナビゲーションバーはまだ白でした。だから私はこの行を追加しました:
navigationController?.navigationBar.backgroundColor = .clear
... et voila!それはトリックをするようでした。
最新のベータ版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
}
}
}
私はこのトピックが古いことを知っていますが、人々がdrawRectメソッドをオーバーロードせずにそれがどのように行われるのかを知りたい場合。
これはあなたが必要とするものです:
self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.opaque = YES;
self.navigationController.navigationBar.tintColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
以下のコードは、このスレッドに選択された上部の回答を拡張して、下部の境界線を取り除き、テキストの色を設定します。
このコードの最後の2つのコード化された行は透明性を設定します。このスレッドからそのコードを借りて、それは完全に機能しました!
「clipsToBounds」プロパティは、透明度を設定せずにORを使用して下の境界線を取り除くコードでした(そのため、代わりに白/黒などの実線の背景を使用する場合、境界線はありません)。
「tintColor」ライン(2番目のコード化されたライン)は、戻るボタンを薄い灰色に設定しました
バックアップとしてbarTintColorを保持しました。透明度が機能しない理由はわかりませんが、機能しない場合は、以前使用していたbgホワイトを使用します
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()
私にとってうまくいったもう1つの方法は、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
}}
Swift 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
完全に透明ですか、それとも写真アプリで見られる半透明の黒のスタイルを使用しているのですか?後者は、そのbarStyle
プロパティをに設定することで実現できますUIBarStyleBlackTranslucent
。前者…わかりません。項目を表示したままにする場合は、バーのビュー階層を掘り下げて、背景を含むビューを削除する必要がある場合があります。
チェックRRViewControllerExtension UINavigationバーの外観の管理に専用されています、。
プロジェクトでRRViewControllerExtensionを使用する場合は、オーバーライドするだけです
-(BOOL)prefersNavigationBarTransparent;
あなたのviewcontrollerで。
extension UINavigationBar {
var isTransperent: Bool {
get {
return false // Just to satisfy property
}
set {
if newValue == true {
self.shadowImage = UIImage()
self.isTranslucent = true
self.setBackgroundImage(UIImage(), for: .default)
}else{
self.shadowImage = UIImage()
self.isTranslucent = false
self.setBackgroundImage(nil, for: .default)
}
}
}
}
[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = nil; self.navigationController.navigationBar.translucent = NO;