マスター-詳細ナビゲーションコントローラーの親コントローラーと子コントローラー間を行き来するとき、上部のナビゲーションバーの右側に暗い影が表示されます。 Xcode 5.1にアップグレードした後に開始しました。荒くて気が散る。どうすればそれを取り除くことができますか?
self.navigationController.navigationBar.translucent = NO;
直した
self.navigationController.view.backgroundColor = [UIColor whiteColor];
Navigation Controllerのビューの背景色を設定することで、この問題を解決しました。
nonameliveの答えは完璧です。 Interface Builderで同じことを実現し、まだ透過性を維持するには、Navigation Controllerを選択し、ユーザー定義のランタイム属性view.backgroundColor
を以下のように設定します。スクリーンショット(IDインスペクター内)。この問題を示すすべてのNavigation Controllerについて繰り返します。
この問題は、CoreGraphicsがアニメーションの開始時にスナップショットを作成するときにUINavigationControllerの黒色(または実際には色なし)が漏れているために発生するようです。したがって、それを白に設定すると、それを防ぐことができます。
これは、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
これはSwiftで動作します
AppDelegate
メソッドのdidFinishLaunchingWithOptions
で、これを設定します。
UIApplication.shared.windows.first?.backgroundColor = .white
半透明のバー(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
self.navigationController!.navigationBar.translucent = false;
これは私のために機能し、新しいViewControllerをプッシュする関数内に配置します
以下も機能し、ナビゲーションバーを透明のままにします。
[UIApplication sharedApplication].keyWindow.backgroundColor = [UIColor whiteColor];
ここに私のバリエーションがあります...それはトムの答えよりもはるかに少ないコードを必要とし、より効率的です。これは、半透明のナビゲーションバーが必要な場合、およびそのシャドウの問題を修正する場合です。
ソースのViewController(Navigation Controllerに埋め込まれている)で...
- (void)viewDidAppear:(BOOL)animated
{
self.navigationController.navigationBar.translucent = YES;
}
そして
- (void)viewWillDisappear:(BOOL)animated
{
self.navigationController.navigationBar.translucent = NO;
}
結果は、Tomが(視覚的に、エンドユーザーに対して)行うことと同じであり、実装が簡単です。お役に立てれば...
標準の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
にコードを追加します。
または、インターフェイスビルダーを使用している場合は、Navigation ControllerからNavigation Barを選択し、Attributes InspectorでStyleとBar Tintの間のTranslucentチェックボックスをオフにして、その奇妙な効果を取り除くことができます-