iOS 6 では、カスタムの背景画像を設定しても、ドロップ シャドウがナビゲーション バーに自動的に追加されるようです。iOS 5 と 6 のシムで同じコードをテストすると、iOS 6 では影が表示されますが、5 では表示されないため、これは iOS 5 には当てはまらないと確信しています。
誰もこれについて何か知っていますか?またはそれを有効/無効にする方法は?
iOS 6 では、カスタムの背景画像を設定しても、ドロップ シャドウがナビゲーション バーに自動的に追加されるようです。iOS 5 と 6 のシムで同じコードをテストすると、iOS 6 では影が表示されますが、5 では表示されないため、これは iOS 5 には当てはまらないと確信しています。
誰もこれについて何か知っていますか?またはそれを有効/無効にする方法は?
これをAppDelegateに配置します
[[UINavigationBar appearance] setShadowImage:[UIImage new]];
// is IOS 7 and later
[[UINavigationBar appearance] setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
これが私のためにそれをしたことです。それが役に立てば幸い!
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)
これは上記のより複雑な回答で解決されていることは知っていますが、これがナビゲーションバーの下に影を隠す最も簡単で簡単な方法です.
self.navigationController.navigationBar.clipsToBounds = YES;
shadowImage
プロパティの件名に関する Apple dev docs からのメモ:
考察: デフォルト値は nil で、デフォルトの影の画像に対応します。非 nil の場合、このプロパティはデフォルトの代わりに表示するカスタム シャドウ イメージを表します。カスタムの影の画像を表示するには、カスタムの背景画像も setBackgroundImage:forBarMetrics: メソッドで設定する必要があります。デフォルトの背景画像が使用される場合、このプロパティの値に関係なく、デフォルトの影の画像が使用されます。
したがって、nil UIImage ハックを使用するには、カスタム ナビゲーション バーの背景画像も設定する必要があります。これも nil 画像である可能性があり、フラットでクリーンな「メトロ」スタイルのナビゲーション バーになります。
[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
また、これを試すことができます:
controller.navigationBar.shadowImage = [[[UIImage alloc] init] autorelease];
コントローラーは UINavigationController です。
一般的な、NDA に違反しない回答:
レイヤーから何かをはみ出させたくない場合は、レイヤーをその境界までマスクします。
[self.layer setMasksToBounds:YES];
それがうまくいかない場合は、高さを明示的に 44 (または iPhone の横向きの場合は 32) に設定します。
shadowImage を null 画像に設定しても機能しますが、OS が iOS 6 より前の場合、ソリューションの表示方法によってプロパティが追加されます。
プロパティまたはメソッドの存在に依存する何かを行うためのより良い方法は次のとおりです。
if ([self.navigationController.navigationBar
respondsToSelector:@selector(shadowImage)]) {
self.navigationController.navigationBar.shadowImage = [[[UIImage alloc] init] autorelease];
}
考えられる解決策は 2 つあります。そのうちの 2 つ目は、他の回答で言及されています。
次のコードを実装します。
// Omit the conditional if minimum OS is iOS 6 or above
if ([UINavigationBar instancesRespondToSelector:@selector(setShadowImage:)]) {
[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
}
出典: iOS での高度な外観のカスタマイズ、@27:15
コメントできないので、ここに私の情報を追加します。
おそらく、上記の提案はベータ版では機能していましたが、現在はそうではないようです。
self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];
上記は機能しません。上記の他の同様の回答も機能しません。私はそれらすべてを試しました。
境界へのクリッピングは機能しますが、他のビューをナビゲーション バーの外にぶら下げたいので、必要な結果が得られません。
iOS6とiOS7の間でナビゲーションバーを同じように見せようとしたときに、このSOの質問に出くわしました。
私がうまくいった答えは、単に使用することでした:
NSMutableDictionary *titleBarAttributes = [NSMutableDictionary dictionaryWithDictionary: [[UINavigationBar appearance] titleTextAttributes]];
[titleBarAttributes setValue:[NSNumber numberWithInt:0] forKey:UITextAttributeTextShadowOffset];
[[UINavigationBar appearance] setTitleTextAttributes:titleBarAttributes];
つまり、シャドウ オフセットをゼロに設定します。
別の方法はどうですか:
UINavigationBar.appearance().barStyle = .Black
暗いナビゲーション バーの場合、iOS は影を表示しません。
Swift 3.0 では、これは次のようになります。
UINavigationBar.appearance().shadowImage = UIImage ()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
私は同じ問題を抱えていましたが、次の方法で解決しました:
CustomNavBar *navBar = (CustomNavBar *)self.navigationController.navigationBar;
[navBar setBackgroundImage:[UIImage imageNamed:@"navigation_bar_gray.png"] forBarMetrics:UIBarMetricsDefault];
navBar.shadowImage = [[UIImage alloc]init]; // this is what acctually removed the shadow under navigation bar