web-dev-qa-db-ja.com

カスタム背景画像を含むナビゲーションバーのiOS 6でナビゲーションバーの影を無効にするにはどうすればよいですか?

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

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

50
Dom Chapman

これを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)
141
Kevin Fernandes

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

self.navigationController.navigationBar.clipsToBounds = YES;
57
Hank Brekke

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];
25
Lee Probert

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

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

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

19
Dima Korbin

一般的な非NDA侵害の答え:

レイヤーから何かが突き出したくない場合は、レイヤーをその境界にマスクします。

[self.layer setMasksToBounds:YES];

高さが単独で機能しない場合は、高さを明示的に44(またはiPhoneの場合は32)に設定します。

7
Steve Cotner

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

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

if ([self.navigationController.navigationBar
respondsToSelector:@selector(shadowImage)]) {
self.navigationController.navigationBar.shadowImage = [[[UIImage alloc] init] autorelease];
}
6
user1202579

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

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

3
eager

self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];が機能しないため、iOS 6とiOS 5の両方でUINavigationBarの影を削除する簡単で実行可能な方法を見つけました。必要な人がこの投稿を参照できることを願っています。

必要なのは、高さがナビゲーションバーの高さより1ピクセル大きい背景画像を1つ準備することです(たとえば、デフォルトのUINavigationBarの場合は320×45、もちろん2倍の場合は640×90)。

次に[[UINavigationBar appearance] setBackgroundImage: ...]を使用すると、シャドウがその1ピクセルに置き換えられます。乾杯!

ところで、TwitterはTwitter.ipaを解凍してbg_nav_bar_events_dark.pngを調べると、サイズが320×47であるため、Twitterでもまったく同じことがわかりました。彼らは3ピクセルのために独自の影を作りました:)

2
xiaobo

IOS6とiOS7の間で同じようにナビバーを取得しようとすると、このSOの質問に出くわしました。

私が働いたとわかった答えは、単に使用することでした:

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

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

1
CharlesA

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

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

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

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

境界線へのクリップは機能しますが、他のビューをナビゲーションバーの外側に表示したいので、期待した結果が得られません。

1

別の方法はどうですか:

UINavigationBar.appearance().barStyle = .Black

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

1
SoftDesigner

私は同じ問題を抱えていて、次のようにして解決しました:

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 
0
Dejan Balaban

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

UINavigationBar.appearance().shadowImage = UIImage ()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
0
Kumar C