Xcode 5.1およびiOS 7.1へのアップグレード後のセグエ移行中のナビゲーションバーの暗い影


91

マスター(詳細ナビゲーションコントローラー)の親コントローラーと子コントローラーの間で前後に移動すると、上部のナビゲーションバーの右側に暗い影が表示されます。Xcode 5.1にアップグレードした後に始まりました。ざらざらして気が散ります。どうすればそれを取り除くことができますか?

回答:


143
self.navigationController.view.backgroundColor = [UIColor whiteColor];

この問題は、ナビゲーションコントローラーのビューの背景色を設定することで解決しました。


この答えは実際には非常に良いです。何らかの理由で、インターフェイスビルダーではナビゲーションコントローラーのビューにアクセスできませんが、darkColorビューがまだ存在しているように見え、この問題が発生します。
superarts.org 2015

1
ナビゲーションコントローラからにじみ出る醜い黒いセクションを表示せずにバーを半透明に保つことができるため、これは素晴らしい答えです。ストーリーボードに設定する方法があったらいいのに。
dimiguel 2015

丁度。時々私はそれについて考えて、ナビゲーションバーの透明性をオフにすることを提案する他の回答に少しがっかりします。基本的に、彼らはこの問題を解決するためです。この回答は実際の修正を指摘しています。この動作はXcode 7 / iOS 9でも同じです
superarts.org

1
ウィンドウの背景がこの問題の根本的な原因ではないため、私はこの回答に反対票を投じました。添付の私のスクリーンショットを参照してください:imgur.com/a/SH5Dp問題がまだ存在することがわかります。暗い色合いが白い色に置き換えられただけです。コントローラーの詳細が「切り取られた」と思われるか、NavBarの下に何も描画しないようにします。
mariotaku

1
tabBarController?.view.backgroundColor = UIColor.white(ルートコントローラーがUITabBarControllerの場合)。
Vishal Singh

53
self.navigationController.navigationBar.translucent = NO; 

直した


どこに置いたの?
Zorayr 2014

マスタービューコントローラーのViewDidLoadメソッド内
Nihat 14

addD viewDidAppear
Abdul Waheed

これが正解だと思います。navigationController.view.backgroundColor = .whiteiOSの11にもう動作しません
AnBisw

1
@AnnjawnはnavigationController.view.backgroundColor = .whiteiOS 12 で動作します。ナビゲーションバーから半透明を削除することは、必要な場合には使用できませんが、黒い影は使用できません。
Alex Motor

38

nonameliveの答えは完璧です。Interface Builder およびSTILL KEEP TRANSLUCENCYで同じことを実現するには、ナビゲーションコントローラーを選択view.backgroundColorし、スクリーンショット(アイデンティティーインスペクター)に示すようにユーザー定義のランタイム属性を設定します。この問題を示すすべてのナビゲーションコントローラについて繰り返します。

この問題全体は、CoreGraphicsがアニメーションでスナップショットを開始するときにUINavigationControllerの黒い色(または実際には色がない)が漏れているために発生しているようです。したがって、それを白に設定すると、それを防ぐことができます。

Identity Inspector->ユーザー定義のランタイム属性


1
私はこのアプローチを好むので、可能な限りInterface Builder UIを使用します。
DazChong、2015

iOS 8.4は
役に立た

3
Xcode 8.3.3で完全に動作します。強調し直すには、UINavigationControllerviewControllerではなくに設定する必要があります。
jungledev

タブコンにnavconがあり、navconのVCの1つで「プッシュ時にボトムバーを非表示」を使用すると、両方のバー(上部と下部)に影が表示されました。navconで白い背景を設定すると、両方の影が修正されました。ありがとう!
nh32rg

6

これはiOS 7.1で導入されたバグのようです。私の場合は、ナビゲーションバーのすぐ下に配置されたUIToolbarが原因です。暗い影は半透明のタブバーにも表示されます。

影は、UIToolbarの背景ビューによって発生しているようです。移行中にツールバーの背景ビューを非表示にするツールバーを備えたビューコントローラーでこの回避策を使用します。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    UIView *toolbarBackgroundView = [self.toolbar findViewRecursively:^BOOL(UIView *subview, BOOL *stop) {
        BOOL isToolbarBackgroundView = ([subview isKindOfClass:[UIImageView class]]
                                        && [NSStringFromClass(subview.class) isEqualToString:@"_UIToolbarBackground"]);
        if (isToolbarBackgroundView) {
            *stop = YES;
        }
        return (! isToolbarBackgroundView);
    }];
    if (toolbarBackgroundView) {
        // fade toolbar background view back in
        [UIView animateWithDuration:0.1f animations:^{
            toolbarBackgroundView.alpha = 1.0f;
        }];
    }
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    UIView *toolbarBackgroundView = [self.toolbar findViewRecursively:^BOOL(UIView *subview, BOOL *stop) {
        BOOL isToolbarBackgroundView = ([subview isKindOfClass:[UIImageView class]]
                                        && [NSStringFromClass(subview.class) isEqualToString:@"_UIToolbarBackground"]);
        if (isToolbarBackgroundView) {
            *stop = YES;
        }
        return (! isToolbarBackgroundView);
    }];
    if (toolbarBackgroundView) {
        // hide toolbar background view
        toolbarBackgroundView.alpha = 0.0f;
    }
}

これはのコードです [UIView findViewRecursively:]

@interface UIView (FindSubview)

- (UIView*)findViewRecursively:(BOOL(^)(UIView* subview, BOOL* stop))recurse;

@end

@implementation UIView (FindSubview)

- (UIView*)findViewRecursively:(BOOL(^)(UIView* subview, BOOL* stop))recurse {
    for (UIView* subview in self.subviews) {
        BOOL stop = NO;
        if (recurse(subview, &stop)) {
            UIView* view = [subview findViewRecursively:recurse];
            if (view) return view;
        } else if (stop) {
            return subview;
        }
    }
    return nil;
}

@end

私はこのレーダーを提出しました:http : //openradar.appspot.com/16418845


2
半透明のナビゲーションバーが必要ない場合は、ソリューションで問題ありません。
トム

を取得する簡単な方法がありbackgroundViewます。[self.toolbar valueForKey:@"_backgroundView"]。これはプライベートAPIであることに注意してください。ただし、これは_backgroundView単なる一般的な名前であるため、Appleに引っかかることはないと思います。
nonamelive 2014年

この答えは、私に必要なことへのヒントを与えてくれました。私の場合、インターフェースビルダーでUIToolbarの半透明オプションのチェックを外すのと同じくらい簡単でした。
グレッグW

4

半透明のバー(TabBarまたはToolBar)で発生するようです。
したがって、それを修正する1つの方法は、_tabBar.translucent = NO;(私の場合)を設定することです。これにより、ナビゲーションバーを半透明のままにしたまま、上部のナビゲーションバーの下に不要な影ができるのを防ぎます。残念ながら、ボトムバーはもはや半透明ではありません。

半透明に戻すこともできますが、これはすべて、プッシュアニメーション全体が終了した後に行う必要があるため、このプロパティの切り替えは顕著です。

ただし、下部のバーも半透明である必要があり、ユーザーに変更を表示したくないので、次のように解決しました。

/*  create a simple quick animation of the bottom bar
    just before pushing the new controller */
[UIView animateWithDuration:0.1
                 animations:^{
                     _tabBar.barTintColor = [UIColor colorWithWhite:0.97254901960784 alpha:1.0]; // this is the closest color for my case
                     _tabBar.translucent = NO;
                 } completion:^(BOOL finished) {
                     /* now when the animation that makes the bar not translucent
                        is finished we can push the new controller
                        the controller is instantiated before the animation code */
                     [self.navigationController pushViewController:controller animated:YES];
                 }];

次に、viewDidAppear:私は単にそれを元に戻します:

[UIView animateWithDuration:0.1
             animations:^{
                     _tabBar.barTintColor = nil;
                     _tabBar.translucent = YES;
                 }];

特に外観は少しだけ変化しますが、ほとんど目立たず、ナビゲーションバーの下に影を付けるよりもはるかに優れています。

他の投稿で特に提案されたのとは異なり、バーが非表示になることもあるので、Appleがこの動作を修正するまで、バーを半透明に保つのに役立つことを願っています UITabBar


@manmalのソリューションを採用することでこの問題を修正できview.backgroundColorました。ストーリーボードでUITabBarControllerのランタイム属性を定義し、それを白色に設定しました。
jamesk

4

これはSwiftで私のために働きます

方法、私はこれを設定します。AppDelegatedidFinishLaunchingWithOptions

UIApplication.shared.windows.first?.backgroundColor = .white

4

上の私にとって、この作品のiOS 13の両方を持つのテーマとも古いiOSのバージョンで。

次のコードをAppDelegateのapplication(didFinishLaunchingWithOptions)メソッドに追加します。

if #available(iOS 13.0, *) {
    window?.backgroundColor = UIColor.systemBackground
} else {
    window?.backgroundColor = UIColor.white
}

私もこの方法を試しましたが、デフォルトモードでビューコントローラーを表示するときに問題が発生します。そうすると、ウィンドウの背景が黒ではなく白になります。奇妙に見えます。この状況を克服するためのアイデアを提案していただけませんか
varun v nair

3

ここに私のバリエーションがあります...トムの答えよりもはるかに少ないコードで済み、より効率的です。これは、半透明のナビゲーションバーが必要で、その影の問題も修正したい場合に使用します。

ソースのViewController(ナビゲーションコントローラーに埋め込まれている)...

- (void)viewDidAppear:(BOOL)animated
{
     self.navigationController.navigationBar.translucent = YES;
}

そして

 - (void)viewWillDisappear:(BOOL)animated
 {
     self.navigationController.navigationBar.translucent = NO;
 }

結果はトムが(視覚的にはエンドユーザーに対して)行うことと同じであり、実装が簡単です。お役に立てれば...


3
self.navigationController!.navigationBar.translucent = false;

これは私のために機能し、新しいViewControllerをプッシュする関数内に配置します


クレイジーですが、すべての答えの中で、それを次のVCにプッシュする機能に配置するという考えがありました。
Coltuxumab

3

以下も機能し、ナビゲーションバーは透明のままです。

[UIApplication sharedApplication].keyWindow.backgroundColor = [UIColor whiteColor];


1

標準のiOS実装とは異なりますが、これは問題を修正するための優れた方法です。

- (void)viewWillAppear:(BOOL)animated {
    [UIView animateWithDuration:0.35f animations:^{
        self.tabBarController.tabBar.alpha = 1.0f;
    }];
}

- (void)viewWillDisappear:(BOOL)animated {
    [UIView animateWithDuration:0.35f animations:^{
        self.tabBarController.tabBar.alpha = 0.0f;
    }];
}

タブバーのフェードイン/フェードアウトアニメーションが表示されます。ルートにコードを追加しますUIViewController


-1

または、インターフェイスビルダーを使用している場合は、ナビゲーションコントローラーからナビゲーションバーを選択し、属性インスペクターの[スタイル]と[バーティント]の間の[半透明]チェックボックスをオフにして、その奇妙な効果を取り除くことができます。

検査官

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.