web-dev-qa-db-ja.com

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

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

84
Nihat
self.navigationController.navigationBar.translucent = NO; 

直した

50
Nihat
self.navigationController.view.backgroundColor = [UIColor whiteColor];

Navigation Controllerのビューの背景色を設定することで、この問題を解決しました。

134
nonamelive

nonameliveの答えは完璧です。 Interface Builderで同じことを実現し、まだ透過性を維持するには、Navigation Controllerを選択し、ユーザー定義のランタイム属性view.backgroundColorを以下のように設定します。スクリーンショット(IDインスペクター内)。この問題を示すすべてのNavigation Controllerについて繰り返します。

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

Identity Inspector -> User Defined Runtime Attributes

36
manmal

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

影は、UIToolbarの背景ビューによって引き起こされるようです。移行中にツールバーの背景ビューを非表示にするツールバーを使用して、View Controllerでこの回避策を使用します:

- (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

6
tom

これはSwiftで動作します

AppDelegateメソッドのdidFinishLaunchingWithOptionsで、これを設定します。

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

半透明のバー(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;
                 }];

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

他の投稿で特にUITabBarに対して提案されたのとは異なり、バーは場合によっては非表示になるため、バーが半透明になるようにApple

4
kacho
self.navigationController!.navigationBar.translucent = false;

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

3
Shyam Raju

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

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

3
seb

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

ソースのViewController(Navigation Controllerに埋め込まれている)で...

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

そして

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

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

3
user2734823

標準の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

または、インターフェイスビルダーを使用している場合は、Navigation ControllerからNavigation Barを選択し、Attributes InspectorでStyleとBar Tintの間のTranslucentチェックボックスをオフにして、その奇妙な効果を取り除くことができます-

Inspector

0
noob