50

iOS 6 では、カスタムの背景画像を設定しても、ドロップ シャドウがナビゲーション バーに自動的に追加されるようです。iOS 5 と 6 のシムで同じコードをテストすると、iOS 6 では影が表示されますが、5 では表示されないため、これは iOS 5 には当てはまらないと確信しています。

誰もこれについて何か知っていますか?またはそれを有効/無効にする方法は?

4

13 に答える 13

141

これをAppDelegateに配置します

[[UINavigationBar appearance] setShadowImage:[UIImage new]];
// is IOS 7 and later
[[UINavigationBar appearance] setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];

これが私のためにそれをしたことです。それが役に立てば幸い!

コメントからの更新を含むSwiftバージョン

    UINavigationBar.appearance().shadowImage = UIImage()
    UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)
于 2012-11-09T19:12:59.910 に答える
57

これは上記のより複雑な回答で解決されていることは知っていますが、これがナビゲーションバーの下に影を隠す最も簡単で簡単な方法です.

self.navigationController.navigationBar.clipsToBounds = YES;
于 2012-10-14T13:34:13.597 に答える
25

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];
于 2013-04-25T09:19:20.053 に答える
19

また、これを試すことができます:

controller.navigationBar.shadowImage = [[[UIImage alloc] init] autorelease];

コントローラーは UINavigationController です。

于 2012-09-18T10:09:36.353 に答える
7

一般的な、NDA に違反しない回答:

レイヤーから何かをはみ出させたくない場合は、レイヤーをその境界までマスクします。

[self.layer setMasksToBounds:YES];

それがうまくいかない場合は、高さを明示的に 44 (または iPhone の横向きの場合は 32) に設定します。

于 2012-07-08T18:26:03.740 に答える
6

shadowImage を null 画像に設定しても機能しますが、OS が iOS 6 より前の場合、ソリューションの表示方法によってプロパティが追加されます。

プロパティまたはメソッドの存在に依存する何かを行うためのより良い方法は次のとおりです。

if ([self.navigationController.navigationBar
respondsToSelector:@selector(shadowImage)]) {
self.navigationController.navigationBar.shadowImage = [[[UIImage alloc] init] autorelease];
}
于 2012-10-31T17:27:15.867 に答える
3

考えられる解決策は 2 つあります。そのうちの 2 つ目は、他の回答で言及されています。

  1. ナビゲーション バーの背景画像の下部に 1 つの透明なピクセルを追加して、高さを 45pt にします。これにより、iOS 6 の影が無効になります。
  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

于 2013-01-26T00:11:20.030 に答える
1

コメントできないので、ここに私の情報を追加します。

おそらく、上記の提案はベータ版では機能していましたが、現在はそうではないようです。

self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];

上記は機能しません。上記の他の同様の回答も機能しません。私はそれらすべてを試しました。

境界へのクリッピングは機能しますが、他のビューをナビゲーション バーの外にぶら下げたいので、必要な結果が得られません。

于 2012-10-30T21:16:52.003 に答える
1

iOS6とiOS7の間でナビゲーションバーを同じように見せようとしたときに、このSOの質問に出くわしました。

私がうまくいった答えは、単に使用することでした:

    NSMutableDictionary *titleBarAttributes = [NSMutableDictionary dictionaryWithDictionary: [[UINavigationBar appearance] titleTextAttributes]];
    [titleBarAttributes setValue:[NSNumber numberWithInt:0] forKey:UITextAttributeTextShadowOffset];
    [[UINavigationBar appearance] setTitleTextAttributes:titleBarAttributes];

つまり、シャドウ オフセットをゼロに設定します。

于 2013-10-16T18:26:15.017 に答える
1

別の方法はどうですか:

UINavigationBar.appearance().barStyle = .Black

暗いナビゲーション バーの場合、iOS は影を表示しません。

于 2015-09-29T08:29:43.513 に答える
0

Swift 3.0 では、これは次のようになります。

UINavigationBar.appearance().shadowImage = UIImage ()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
于 2016-10-24T08:50:24.287 に答える
0

私は同じ問題を抱えていましたが、次の方法で解決しました:

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 
于 2012-10-04T07:18:59.030 に答える